Medicinal chemists usually draw molecules in a chemical structure editor such as ChemDraw. We then often export them as SDF or a similar format and pass them to other tools to predict properties or generate analogs. I do this too, and bridging several tools this way is tedious. I had long thought it would be good to have a tool that integrates the editor with in silico functions such as descriptor and similarity calculation, structure generation, property prediction and retrosynthesis analysis. So I have started developing a workspace tool, which I named ChemOmni, that combines a chemical structure editor with an LLM chat and lets the LLM act as the bridge between the compounds you draw and the tools. So far, the UI that unifies the editor and the chat is working. The editor is Ketcher, EPAM’s open-source structure editor, and the AI in the chat answers by calling RDKit calculations as tools.
In ChemOmni, the editor comes first and the chat plays a supporting role. When you ask the AI for a calculation or an explanation, the chat shows property tables and structure images along with the written answer. Pressing “Open” on a structure opens it in a new tab. The AI never rewrites a structure you drew on its own. The app runs on your own PC, and you choose an OpenAI or Anthropic model on screen.
Several tools already combine a structure editor with an AI chat. Examples are ChemStitch, a web service that pairs Ketcher with an AI chat; Anthropic’s Claude Science, which can use Ketcher as a connector; and a chat plugin for the molecule editor MoleditPy. The combination itself is not new. This project is a proof of concept (PoC) to see whether the same kind of tool can be built locally from open-source parts with Claude Code, and how useful it is.
Source code: https://github.com/aurio9923/chemomni (MIT License)
Trying It on Three BCR-ABL Inhibitors
I opened three tabs and put in the structures of imatinib, nilotinib and dasatinib, one in each (drawn by pasting SMILES). The model is the low-cost gpt-6-luna. With every message, the chat passes the structures in all open tabs to the AI. So you can simply write “this compound” or “the three tabs,” and it knows which structures you mean.
Example 1: Calculating properties
Calculate the properties of this compound
The AI called the property tool and a table came back (right side of Figure 1). The values for imatinib are molecular weight 493.62, cLogP 4.59, TPSA 86.3 Ų, 2 hydrogen-bond donors, 7 acceptors, 7 rotatable bonds and QED 0.39. The AI’s text was short: the compound “passes the Lipinski and Veber heuristics and has no PAINS or Brenk alerts.” The numbers were calculated by RDKit, not invented by the LLM, and I confirmed them by recalculating with RDKit outside the app. It took about 3 to 5 seconds from sending until the table and the answer were complete.
The AI is normally instructed to answer in one to three sentences and to avoid repeating numbers that are in the table, so that you do not have to read in prose what the table already shows.
Example 2: Explaining a structure
Explain the features of this structure from a medicinal chemistry perspective
The AI answers in detail only for open questions like this one. Here it identified the structure as imatinib and explained it in parts: the pyridyl–pyrimidine core with the anilino linker, the benzamide linker and the methylpiperazine tail, followed by a medicinal-chemistry trade-off. It also mentioned that imatinib binds the inactive kinase conformation (type II). The answer took about 4 to 9 seconds.
This answer comes from the model’s knowledge, not from a tool calculation, and it cites no sources. The broad picture is correct, but some points that matter for medicinal chemistry are missing or vague. For example, it says the benzamide “adds hydrogen-bonding capacity,” but not that the amide forms specific hydrogen bonds that stabilize the inactive conformation. It calls the methylpiperazine “strongly basic,” although its pKa is around 8. It also does not mention the methyl group on the central benzene ring, which contributed greatly to kinase selectivity. A web research feature might improve this.
For now, the answer is useful for getting an overview, but the role of each part needs to be checked against the literature before you rely on it.
Example 3: Comparing similarity across three tabs
Compare the similarity between the compounds in the three open tabs
The AI called the similarity tool to compare the three pairs and summarized them in a table at the end. The metric is Tanimoto similarity on Morgan fingerprints (radius 2, 2048 bits).
| Pair | Tanimoto similarity |
|---|---|
| Imatinib – Nilotinib | 0.517 |
| Imatinib – Dasatinib | 0.275 |
| Nilotinib – Dasatinib | 0.184 |
Two tool calls failed along the way (the red × rows in Figure 3). When the AI copied the SMILES of dasatinib, it dropped the digit that closes the piperazine ring. RDKit replied that it could not read the string, and after one more failed attempt the AI called the tool with the correct SMILES. Failed calls stay in the chat, so you can trace what happened afterward. As long as the LLM copies SMILES itself, this kind of failure can happen.
Example 4: Filtering by substructure
Of the three tabs, which contain an aminopyrimidine (2-aminopyrimidine)?
Asked this way, the AI answered without using a tool: “Imatinib and Nilotinib contain a 2-aminopyrimidine; Dasatinib does not.” That is correct: dasatinib’s pyrimidine ring has a methyl group at position 2, and its amino groups are at positions 4 and 6. But this is the AI’s judgment from reading the SMILES, and the screen shows no evidence for it. So I changed the question.
Run a substructure search for 2-aminopyrimidine on the compounds in the three tabs
This time the substructure search tool was called, and two of the three compounds matched. The matched atoms are shown in red in the structure images. Even for the same question, whether the AI uses a tool depends on how you ask. When you want to see the evidence on screen, you need to ask for it explicitly, with words like “calculate” or “search.”
I sent each version of the question six times. The first version never used a tool; five answers were correct, and one wrongly said that all three compounds contain the group. The “substructure search” version used the tool all six times, but only four answers were correct. In the other two, the AI wrote the query as 2-aminopyrazine (Nc1nccnc1) instead of 2-aminopyrimidine (Nc1ncccn1) and reported that nothing matched. Even when the tool’s calculation is right, the answer is wrong if the LLM gives the tool the wrong input. So even for an answer that used a tool, you need to check what went into it. Answers took about 4 to 7 seconds for the first version and 4 to 5 seconds for the search.
Decisions Made While Building It
- The editor comes first. AI results go to new tabs, and the structure you drew is not overwritten. It is overwritten only when you ask to replace it (a feature I will cover next time).
- RDKit does the calculations. At the stage covered here, the AI has four tools: property calculation, SMILES validation, similarity between two molecules, and substructure search. Structure images appear only on screen and are not sent to the LLM, because sending them would increase the amount of data (tokens) sent to the AI.
- The editor is Ketcher. It can save everything drawn and restore it, lets a program read the current selection, and runs in the browser alone, without a server.
- Models are switched on screen. You pick the model from the dropdown above the chat. The name of the model that wrote each answer appears below it. I confirmed with the real APIs that four models work: OpenAI’s gpt-6.1-sol, gpt-6.1-terra and gpt-6-luna, and Anthropic’s Claude Haiku 5.5. In my use so far, the low-cost gpt-6-luna has been enough.
Built Through Conversation with Claude Code
The code was written by the coding agent Claude Code. This is what is known as vibe coding. My part was deciding what to build and running it to check the results.
That said, I did not simply have it start writing. Before any code, I had the AI ask design questions, and I answered them, settling 47 issues one at a time (using the “grilling” skill).
Next Time and Beyond
Next time I will cover editing structures from the chat. For example, if you ask to add a fluorine at the 4-position of a phenyl ring, the edited structure appears in a new tab.
Beyond that, I plan to build features in which the AI produces new structures, such as analog proposals. Having an LLM propose structures is already done in many tools and studies. In ChemOmni, I intend to lay the proposed structures out in tabs so that you can compare them with the drawn structure and their properties, and then choose. From here, I will explore the uses that are possible because the chat is integrated with the editor.
Notes
- Model: OpenAI’s gpt-6-luna (Responses API; reasoning effort low, the app’s default). Each question was sent once for the screenshots, except for Figure 3, which comes from one of the six repeat runs because the run used for the other screenshots had no failed call. Even for the same question, the way the AI answers and whether it uses a tool can change from run to run.
- Structures: imatinib
Cc1ccc(NC(=O)c2ccc(CN3CCN(C)CC3)cc2)cc1Nc1nccc(-c2cccnc2)n1, nilotinibCc1ccc(C(=O)Nc2cc(C(F)(F)F)cc(-n3cnc(C)c3)c2)cc1Nc1nccc(-c2cccnc2)n1, dasatinibCc1nc(Nc2ncc(C(=O)Nc3c(C)cccc3Cl)s2)cc(N2CCN(CCO)CC2)n1. - Checking the numbers: The properties in Example 1, the similarities in Example 3 and the matches in Example 4 were recalculated with RDKit 2026.09.1 outside the app and agreed with the values on screen (similarity is Tanimoto on Morgan fingerprints with radius 2 and 2048 bits; the substructure is 2-aminopyrimidine).
- Similar tools: I checked these on each tool’s introduction page (ChemStitch’s official site, the Claude Science documentation and the MoleditPy plugin’s page). I have not used them to compare.