local _VERSION = '0.1.0'; local DEFAULT_PROMPT = 'reply with exactly: pong'; local function trimTrailingSlash(value) return (value:gsub('/+$', '')); end local function readAllAndClose(response) local body = response.readAll(); response.close(); return body; end local function statusCode(response) if response.getResponseCode then return response.getResponseCode(); end return nil; end local function mapStatusError(code) if code == 401 then return 'token invalide'; end if code == 413 then return 'prompt trop long'; end if code == 502 then return 'agent indisponible'; end if code == 504 then return 'agent trop lent'; end if code then return 'erreur proxy: HTTP ' .. tostring(code); end return 'erreur proxy inconnue'; end local function createAiHelloWorld(opts) opts = opts or {}; local httpLib = opts.http or http; local settingsLib = opts.settings or settings; local prompt = opts.prompt or DEFAULT_PROMPT; local api = {}; function api.version() return _VERSION; end function api.clearSession() settingsLib.unset('opencc.session_id'); if settingsLib.save then settingsLib.save(); end end function api.askHello(options) options = options or {}; local proxyUrl = options.proxyUrl or settingsLib.get('opencc.proxy_url'); if not proxyUrl or proxyUrl == '' then return false, 'missing opencc.proxy_url; run: settings set opencc.proxy_url '; end local token = options.proxyToken or settingsLib.get('opencc.proxy_token'); if not token or token == '' then return false, 'missing opencc.proxy_token; run: settings set opencc.proxy_token '; end local sessionId = options.sessionId; if sessionId == nil then sessionId = settingsLib.get('opencc.session_id'); end local body = { prompt = prompt }; if sessionId and sessionId ~= '' then body.sessionId = sessionId; end local response = httpLib.post( trimTrailingSlash(proxyUrl) .. '/ask', textutils.serializeJSON(body), { ['Authorization'] = 'Bearer ' .. token, ['Content-Type'] = 'application/json', } ); if not response then return false, 'proxy injoignable. Verifie opencc.proxy_url et http.rules'; end local code = statusCode(response); local responseBody = readAllAndClose(response); if code and code ~= 200 then return false, mapStatusError(code); end local decoded = textutils.unserializeJSON(responseBody or ''); if type(decoded) ~= 'table' then return false, 'reponse proxy invalide'; end if type(decoded.reply) ~= 'string' then return false, 'reponse proxy sans reply'; end if type(decoded.sessionId) == 'string' and decoded.sessionId ~= '' then settingsLib.set('opencc.session_id', decoded.sessionId); if settingsLib.save then settingsLib.save(); end end return true, { reply = decoded.reply, sessionId = decoded.sessionId, truncated = decoded.truncated == true, }; end return api; end return createAiHelloWorld;