
The TypeScript-first AI platform for developers
Autonomous AI agents and LLM based workflows
Home | Setup | Observability | Function calling | Autonomous AI Agent | AI Software Engineer | AI Code reviews | Tools/Integrations | Roadmap
Features | UI Examples | Code examples | Contributing
TypedAI is a full-featured platform for developing and running agents, LLM based workflows and chatbots.
Included are capable software engineering agents, which have assisted building the platform.
TypedAI provides powerful command-line tools for automation and development workflows:
# Quick examples using the ai wrapper script
ai query "What test frameworks does this repository use?"
ai code "Add error handling to the user authentication function"
ai research "Latest developments in large language models"
The ai script runs locally while aid runs in Docker for isolation. Both provide access to all CLI agents including the specialized codeAgent for autonomous code editing tasks.
For comprehensive CLI documentation, see the CLI Usage Guide.
More details at the Autonomous agent docs
More details at the Software developer agents docs.









Default values can also be set from environment variables.
TypedAI doesn't use LangChain, for many reasons that you can read online
The scope of the TypedAI platform covers functionality found in LangChain and LangSmith.
Let's compare the LangChain document example for Multiple Chains to the equivalent TypedAI implementation.
import { PromptTemplate } from "@langchain/core/prompts";
import { RunnableSequence } from "@langchain/core/runnables";
import { StringOutputParser } from "@langchain/core/output_parsers";
import { ChatAnthropic } from "@langchain/anthropic";
const prompt1 = PromptTemplate.fromTemplate(
`What is the city {person} is from? Only respond with the name of the city.`
);
const prompt2 = PromptTemplate.fromTemplate(
`What country is the city {city} in? Respond in {language}.`
);
const model = new ChatAnthropic({});
const chain = prompt1.pipe(model).pipe(new StringOutputParser());
const combinedChain = RunnableSequence.from([
{
city: chain,
language: (input) => input.language,
},
prompt2,
model,
new StringOutputParser(),
]);
const result = await combinedChain.invoke({
person: "Obama",
language: "German",
});
console.log(result);
import { runAgentWorkflow } from '#agent/agentWorkflowRunner';
import { anthropicLLMs } from '#llms/anthropic'
const cityFromPerson = (person: string) => `What is the city ${person} is from? Only respond with the name of the city.`;
const countryFromCity = (city: string, language: string) => `What country is the city ${city} in? Respond in ${language}.`;
runAgentWorkflow({ llms: anthropicLLMs() }, async () => {
const city = await llms().easy.generateText(cityFromPerson('Obama'));
const country = await llms().easy.generateText(countryFromCity(city, 'German'));
console.log(country);
});
The TypedAI code also has the advantage of static typing with the prompt arguments, enabling you to refactor with ease. Using simple control flow allows easy debugging with breakpoints/logging.
To run a fully autonomous agent:
startAgent({
agentName: 'Create ollama',
initialPrompt: 'Research how to use ollama using node.js and create a new implementation under the llm folder. Look at a couple of the other files in that folder for the style which must be followed',
functions: [FileSystem, Perplexity, CodeEditinAgent],
llms,
});
LLM function calling schema are automatically generated by having the @func decorator on class methods, avoiding the
definition duplication using zod or JSON.
@funcClass(__filename)
export class Jira {
instance: AxiosInstance | undefined;
/**
* Gets the description of a JIRA issue
* @param {string} issueId - the issue id (e.g. XYZ-123)
* @returns {Promise<string>} the issue description
*/
@func()
async getJiraDescription(issueId: string): Promise<string> {
if (!issueId) throw new Error('issueId is required');
const response = await this.axios().get(`issue/${issueId}`);
return response.data.fields.description;
}
}
We warmly welcome contributions to the project through issues, pull requests or discussions
$ claude mcp add typedai \
-- python -m otcore.mcp_server <graph>