arc-agents
Version:
A library for creating and deploying gaming agents at scale
117 lines (104 loc) • 3.03 kB
JavaScript
const { AgentCore } = require('./agent-core')
const AgentVars = require('./agent-vars')
const {
addRequestInterceptor,
addAuthorizationInterceptor
} = require('../backend-utils/interceptors')
const { default: axios } = require('axios')
class BaseAgent extends AgentCore {
constructor(
architectureId,
userId,
slotIdx=0,
agentConfig={ useAgentWrapper: false },
delayInit=true
) {
super(agentConfig)
if (userId === undefined) {
throw Error("User ID Not Provided")
}
this.architectureId = architectureId
this.userId = userId
this.slotIdx = slotIdx
if (!delayInit) {
this.initialize()
}
}
static overrideBackendUrl(newBackend) {
AgentVars.backend = newBackend
}
static addRequestInterceptor(data) {
addRequestInterceptor(data)
}
static addAuthorizationInterceptor(token) {
addAuthorizationInterceptor(token)
}
static getHeaders() {
return {
"x-api-key": AgentVars.apiKey,
"authorization": AgentVars.authorization
}
}
getModelSlotQuery() {
return 'gameId=' + AgentVars.gameId +
'&architectureId=' + this.architectureId +
'&userId=' + this.userId +
'&slotIdx=' + this.slotIdx
}
async initialize() {
try {
const validBool = await this.getModelData()
if (validBool) {
const createdNewModel = this.createAgent(this.modelData)
delete this.modelData
if (createdNewModel) {
await this.save(true)
}
}
else {
throw Error("Could not fetch model")
}
}
catch {
throw Error("Failed to initialize model")
}
}
async getModelData() {
try {
const modelDataResult = await axios.get(
`${AgentVars.backend}training/get-model-data?${this.getModelSlotQuery()}`,
{ headers: BaseAgent.getHeaders() }
)
this.modelData = {}
if (modelDataResult.data.modelData && modelDataResult.data.metadata) {
this.modelData.parameters = modelDataResult.data.modelData.parameters
this.modelData.config = {
...modelDataResult.data.modelData.config,
modelType: modelDataResult.data.metadata.modelType
}
}
return true
}
catch (err) {
console.log(err.response?.data)
return false
}
}
// async switchModelSlot(slotIdx) {
// this.slotIdx = slotIdx
// await this.initialize()
// }
async save(newModelBool=false) {
this.model.formatModelToSave()
await axios.post(`${AgentVars.backend}training/save-model`, {
gameId: AgentVars.gameId,
architectureId: this.architectureId,
userId: this.userId,
slotIdx: this.slotIdx,
modelData: newModelBool ? this.model.modelData : this.trainedModelData
},
{ headers: BaseAgent.getHeaders() }
)
}
}
module.exports = BaseAgent