COOKIES! This blog uses cookies!
I am completely out of control of cookies here, otherwise I would have disabled them (it is controlled by the platform).
If you don't like cookies and being tracked please leave this blog immediately.

Sunday, 29 June 2025

For the past few months, I have been quietly working with family and friends on a small open-source AI tool that performs code reviews. It reads the diff of a pull request from GitHub and then fetches requirements from Jira or from a GitHub issue.

The tool is called Gaunt Sloth assistant, the source code can be found at GitHub:

https://github.com/andruhon/gaunt-sloth-assistant

The tool is built with TypeScript and working on Linux, Windows and MacOS.

https://www.npmjs.com/package/gaunt-sloth-assistant

Installation is as simple as npm install gaunt-sloth-assistant -g

Currently we have presets for Gemini (VertexAI), Claude (Anthropic) and for text generation models provided by Groq.

I never anticipated Gaunt Sloth to be a coding agent; I was primarily aiming for it to do code reviews for me.

But since we added filesystem support, it appeared that Gaunt Sloth is actually capable of doing a coding job (particularly with thinking models).

Today I wanted to add DeepSeek support and first I installed the necessary dependency `@langchain/deepseek` and created the following manual config:

.gsloth.config.mjs

```javascript

import { statusUpdate } from './dist/tools/statusUpdate.js';

import GthFileSystemToolkit from './dist/tools/GthFileSystemToolkit.js';

export async function configure() {

  const deepseek = await import('@langchain/deepseek');

  return {

    llm: new deepseek.ChatDeepSeek({

      model: 'deepseek-reasoner',

    }),

    tools: [

      statusUpdate,

      new GthFileSystemToolkit()

    ]

  };

}

```

With this, I was able to confirm that all functions I tried were working well.

I thought, "Why don't I ask DeepSeek to create a config preset for itself?", so I quickly created the following requirements file:

```

# Add DeepSeek preset

DeepseekReasoner confirmed to work well with Gaunt Sloth.

- Inspect manual DeepSeek config at .gsloth.config.mjs

- Inspect other existing configs at src/configs/,

- Create similar preset config for deepseek (please structure it like src/configs/anthropic.ts, but use ChatDeepSeek from `@langchain/deepseek` like in .gsloth.config.mjs)

- Update src/config.ts to make sure deepseek is supported

- Add a new integration test config to integration-tests/configs

- Don't forget to update integration-tests/setup-config.js

```

Then I started Gaunt Sloth with `gth code` and typed `implement req/deepseek.md`, and it went on building.

It's a bit slowish, but once it finished, I quickly reviewed the code and it was looking fine, so I went straight to running integration tests

with `npm run it deepseek` and they all passed! This is truly impressive considering how much cheaper this model is; as of today it is US$2.19 per million tokens (Gemini Pro is $10/MTok and Claude is $15/MTok)!

I just ran `npm run lint -- --fix` and pushed this commit https://github.com/andruhon/gaunt-sloth-assistant/commit/6fe9fbd20232a63953b9dc1e5563ad8bf8eb8da9