Class: Ask::Rails::Harness::ChatController
- Inherits:
-
ActionController::Base
- Object
- ActionController::Base
- Ask::Rails::Harness::ChatController
- Defined in:
- app/controllers/ask/rails/harness/chat_controller.rb
Instance Method Summary collapse
-
#audit ⇒ Object
GET /ask/sessions/:session_id/audit — get audit logs for a session.
-
#create ⇒ Object
POST /ask/sessions — create a new session.
-
#destroy_all ⇒ Object
DELETE /ask/sessions — destroy all sessions.
-
#destroy_session ⇒ Object
DELETE /ask/sessions/:session_id — destroy a specific session.
-
#history ⇒ Object
GET /ask/sessions/:session_id/messages — get message history as JSON.
-
#index ⇒ Object
GET /ask — main chat interface.
-
#index_sessions ⇒ Object
GET /ask/sessions — list all sessions.
-
#message ⇒ Object
POST /ask/sessions/:session_id/messages — send a message, get SSE stream.
-
#show ⇒ Object
GET /ask/sessions/:id — show a specific session.
-
#stream ⇒ Object
GET /ask/sessions/:session_id/stream — SSE stream for an existing session.
Instance Method Details
#audit ⇒ Object
GET /ask/sessions/:session_id/audit — get audit logs for a session
116 117 118 119 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 116 def audit logs = load_session_audit_logs(@session_id) render json: logs end |
#create ⇒ Object
POST /ask/sessions — create a new session
23 24 25 26 27 28 29 30 31 32 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 23 def create session_id = SecureRandom.uuid agent = build_agent_session agent.save (session_id, agent) redirect_to ask_rails_harness.root_path end |
#destroy_all ⇒ Object
DELETE /ask/sessions — destroy all sessions
122 123 124 125 126 127 128 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 122 def destroy_all persistence = Ask::Rails::Harness.configuration.persistence_adapter if persistence persistence.list.each { |id| persistence.delete(id) } end redirect_to ask_rails_harness.root_path end |
#destroy_session ⇒ Object
DELETE /ask/sessions/:session_id — destroy a specific session
131 132 133 134 135 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 131 def destroy_session persistence = Ask::Rails::Harness.configuration.persistence_adapter persistence&.delete(params[:session_id]) redirect_to ask_rails_harness.root_path end |
#history ⇒ Object
GET /ask/sessions/:session_id/messages — get message history as JSON
110 111 112 113 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 110 def history = (@session_id) render json: end |
#index ⇒ Object
GET /ask — main chat interface
15 16 17 18 19 20 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 15 def index @sessions = load_sessions @active_session = @sessions.first @audit_logs = load_recent_audit_logs render :index end |
#index_sessions ⇒ Object
GET /ask/sessions — list all sessions
42 43 44 45 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 42 def index_sessions @sessions = load_sessions render json: @sessions end |
#message ⇒ Object
POST /ask/sessions/:session_id/messages — send a message, get SSE stream
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 48 def prompt = params[:message].to_s.strip return head :bad_request if prompt.empty? response.headers["Content-Type"] = "text/event-stream" response.headers["Cache-Control"] = "no-cache" response.headers["X-Accel-Buffering"] = "no" response.headers["Last-Modified"] = Time.now.httpdate self.response_body = Enumerator.new do |yielder| agent = resume_or_create_session(@session_id) # Subscribe to tool execution events tool_sub = subscribe_tool_events(agent, yielder) yielder << "data: #{JSON.generate(type: 'start', session_id: @session_id)}\n\n" begin agent.run(prompt) do |chunk| if chunk.content&.length&.> 0 yielder << "data: #{JSON.generate(type: 'delta', content: chunk.content)}\n\n" end if chunk.thinking&.length&.> 0 yielder << "data: #{JSON.generate(type: 'thinking', content: chunk.thinking)}\n\n" end end agent.save @session = agent yielder << "data: #{JSON.generate(type: 'done', session_id: @session_id)}\n\n" rescue Ask::Agent::MaxTurnsExceeded => e yielder << "data: #{JSON.generate(type: 'error', message: "Agent hit the turn limit (#{e.})")}\n\n" rescue Ask::Auth::MissingCredential => e yielder << "data: #{JSON.generate(type: 'error', message: "Missing API key: #{e.}. Check your provider configuration.")}\n\n" rescue Ask::Auth::InvalidCredential => e yielder << "data: #{JSON.generate(type: 'error', message: "Invalid API key: #{e.}. Update your credentials.")}\n\n" rescue StandardError => e yielder << "data: #{JSON.generate(type: 'error', message: "Agent error: #{e.}")}\n\n" end ensure agent&.remove_event_subscriber(tool_sub) if tool_sub end end |
#show ⇒ Object
GET /ask/sessions/:id — show a specific session
35 36 37 38 39 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 35 def show @messages = (@session_id) @audit_logs = load_session_audit_logs(@session_id) render json: { id: @session_id, messages: @messages, audit_logs: @audit_logs } end |
#stream ⇒ Object
GET /ask/sessions/:session_id/stream — SSE stream for an existing session
94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
# File 'app/controllers/ask/rails/harness/chat_controller.rb', line 94 def stream response.headers["Content-Type"] = "text/event-stream" response.headers["Cache-Control"] = "no-cache" response.headers["X-Accel-Buffering"] = "no" self.response_body = Enumerator.new do |yielder| = (@session_id) audit_logs = load_session_audit_logs(@session_id) yielder << "data: #{JSON.generate(type: 'history', messages: , audit_logs: audit_logs)}\n\n" sleep 30 yielder << "data: #{JSON.generate(type: 'keepalive')}\n\n" end end |