The objective of this paper is twofold. In its first part, we survey the state of the art in research on agent architectures. The architecture of an agent describes its modules and capabilities, and how these operate together. We structure the field by investigating three important research threads, i.e. architectures for reactive agents, deliberative agents and interacting agents. Then we describe various hybrid approaches that reconcile these three threads, aiming at a combination of different features like reactivity, deliberation and the ability to interact with other agents. These approaches are contrasted with architectural issues of recent agent-based work, including software agents, softbots, believable agents, as well as commercial agent-based systems. The second part of the paper addresses software engineers and system designers who are interested in applying agent technology to their problem domains. The objective of this part is to assist these readers in deciding which agent architecture to choose for a specific application. We characterise the most important domains to which the different approaches described in the first part have been applied, propose an application-related taxonomy of agents, and give a set of guidelines to select the right agent (architecture) for a given application.