Class: Ask::Providers::OpenaiCodex

Inherits:
OpenAI
  • Object
show all
Defined in:
lib/ask/provider/openai_codex.rb

Overview

OpenAI Codex — requests routed through a ChatGPT subscription via OAuth (the access token + account id come from ask-auth's OpenaiCodex provider, passed explicitly by the host app: api_key / account_id).

Always speaks the Responses API at chatgpt.com/backend-api/codex/responses, and streams the Responses SSE event shape (response.output_text.delta, function_call item events, response.completed) — the chat/completions parsing in the base class doesn't apply here.

Constant Summary collapse

API_BASE =
"https://chatgpt.com/backend-api/codex"
SLUG =
"openai_codex"

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from OpenAI

#build_request, capabilities, configuration_options, configuration_requirements, #embed, #extract_responses_provider_results, #extract_responses_tool_calls, #format_message, #format_responses_content_block, #format_responses_input, #format_responses_tools, #format_tools, #initialize, #list_models, #parse_error, #parse_response, #parse_stream, #responses_chat, #responses_chat_nonstream, #responses_chat_stream, #split_tools

Methods included from LLM::ProviderConfig

#build_request, #format_message, #format_tools, #parse_response, #parse_stream

Methods included from LLM::SSEBuffer

#each_sse_event, #init_sse_buffer

Constructor Details

This class inherits a constructor from Ask::Providers::OpenAI

Class Method Details

.slugObject



21
22
23
# File 'lib/ask/provider/openai_codex.rb', line 21

def self.slug
  SLUG
end

Instance Method Details

#api_baseObject



25
26
27
# File 'lib/ask/provider/openai_codex.rb', line 25

def api_base
  @config.base_url || API_BASE
end

#chat(messages, model:, tools: nil, temperature: nil, stream: nil, schema: nil, **params, &block) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ask/provider/openai_codex.rb', line 35

def chat(messages, model:, tools: nil, temperature: nil, stream: nil, schema: nil, **params, &block)
  msgs = messages.is_a?(Ask::Conversation) ? messages.to_a : messages
  regular_tools, = split_tools(tools)

  payload = {
    model: model,
    input: format_responses_input(msgs)
  }
  payload[:tools] = format_tools(regular_tools) if regular_tools&.any?
  payload[:temperature] = temperature if temperature
  payload.merge!(params)

  if stream
    codex_stream(payload, model, &block)
  else
    responses_chat_nonstream(payload, model, [])
  end
end

#headersObject



29
30
31
32
33
# File 'lib/ask/provider/openai_codex.rb', line 29

def headers
  super.tap do |h|
    h["ChatGPT-Account-Id"] = @config. if @config.
  end
end