← Back to blog
· Piergiacomo De MarchiAI AgentAuto-OptimizationTutorial

Revolutionizing Pharma AI with Afnio: How Auto-Optimized Agents Achieve a 45% Accuracy Boost in Minutes

In this article, we showcase Afnio in action: a game-changing AI agent framework powered by a state-of-the-art optimizer that automatically fine-tunes entire agent workflows—including prompts, model selection, context size, and reasoning steps—delivering production-level accuracy in minutes, not months.

To illustrate Afnio's impact, let's dive into a real-world use case where it significantly optimized the performance of an AI agent for a large pharmaceutical company. The agent, tasked with analyzing vast amounts of scientific publications and patents, was used to advise the company on which therapeutic targets they should invest in. By applying Afnio, we were able to boost the agent's response accuracy by a remarkable 45%.

Brief Overview of Afnio

At its core, Afnio represents agents as symbolic Directed Acyclic Graphs (DAGs) and applies a novel optimization approach, combining textual gradient descent, reflective evolution, and hyperparameter search techniques. Afnio rewrites all the prompts used by an AI agent, selects the best LLM model for each node in the graph, and adjusts parameters such as context size, temperature, reasoning steps, and demonstrations.

Afnio's methodology integrates breakthroughs like TextGrad and GEPA, which are pushing beyond established approaches like RLHF by delivering superior performance at a lower cost.

To run optimization, Afnio takes as inputs a training set of examples, a validation set, and an evaluation metric of choice. In turn, it rewrites all the prompts of the agent and tunes all its hyperparameters.

Afnio fitting process

Large Pharma Competitive Intelligence: Therapeutic Target Landscape

To illustrate Afnio's impact, let's dive into a real-world use case where it optimized the performance of an AI agent for a large pharmaceutical company. The agent, designed to analyze vast amounts of scientific publications and patents, serves as a competitive intelligence tool, advising the company on which therapeutic targets to invest in for their R&D and IP strategy. By leveraging Afnio, we achieved a remarkable 45% boost in the agent's response accuracy—all in just 20 minutes of computation and for only $5.

Therapeutic extractor agent

We identified that the key issue lay in the RAG tool used by the agent to extract and normalize therapeutic targets from patents. This block had been failing repeatedly—an issue we resolved using Afnio's optimization capabilities and Tellurio Studio's experiment tracking UI. To keep this tutorial concise, we'll focus on optimizing this specific tool rather than the entire AI agent end-to-end.

Now, let's explore the code we used with Afnio to optimize the agent's performance.

Afnio Optimization in Action

As first thing we install afnio.

$ pip install afnio

Then we import all the necessary libraries

import os
import json
import re
from getpass import getpass
 
from bio_patent import BioPatent
from utils import print_html_table
 
import afnio
import afnio.tellurio as te
import afnio.cognitive as cog
import afnio.cognitive.functional as F
 
from afnio import set_backward_model_client, get_backward_model_client
from afnio.models.openai import AsyncOpenAI
from afnio.utils.data import DataLoader
from afnio.trainer import Trainer

Next, we provide the OpenAI API key and we login into Tellurio Studio using our API key.

if not (openai_api_key := os.getenv("OPENAI_API_KEY")):
    openai_api_key = getpass("🔑 Enter your OpenAI API key: ")
os.environ["OPENAI_API_KEY"] = openai_api_key
 
te.configure_logging("INFO")
te.login(api_key="TELLURIO_API_KEY")
run = te.init("dmpiergiacomo", "Therapeutic Extraction")

It's time to load our datasets and dataloaders. Afnio optimizes memory usage by yielding the dataloader, allowing it to process data in chunks rather than loading everything into memory at once.

BATCH_SIZE = 25
 
training_data = BioPatent(split="train", root="data")
validation_data = BioPatent(split="val", root="data")
test_data = BioPatent(split="test", root="data")
 
train_dataloader = DataLoader(training_data, batch_size=BATCH_SIZE, shuffle=True)
val_dataloader = DataLoader(validation_data, batch_size=BATCH_SIZE, seed=42)
test_dataloader = DataLoader(test_data, batch_size=BATCH_SIZE, seed=42)

Afnio is extremely powerful. With very few data samples it can lead to great performance increase. In this case our training set contains only 120 samples.

Each dataset entry is a pair of relevant patent paragraphs and the therapeutic target we expect to extract from them.

RAG Retrieved Patent ParagraphsCorrect Therapeutic Target
[para-001] PARAGRAPH 1 Query match: KRAS inhibitor compound In one aspect, the disclosed compounds may effectuate the protein-protein interactions between KRAS(G12D/C/V) and downstream signaling components such as RAFI or PI3K. Thus, provided herein are methods of treating conditions which are responsive to the degradation of KRAS(G12D/C/V) comprising administering to a subject in need thereof, a therapeutically effective amount of one or more compounds or compositions described herein. Also provided is the use of one or more compounds or compositions described herein in the manufacture of a medicament for treating conditions which are responsive to the degradation of KRAS(G12D/C/V). Further provided is the use of a compound or composition described herein for treating conditions which are responsive to the degradation of KRAS(G12D/C/V). | [para-002] PARAGRAPH 2 Query match: KRAS inhibitor compound AsPC-1 human pancreatic adenocarcinoma, homozygous KRAS(G12D), (ATCC, #CRL-1682); A-427 human lung carcinoma, heterozygous KRAS(G12D), (ATCC, #HTB-53); AGS human gastric adenocarcinoma, heterozygous KRAS(G12D), (ATCC, #CRL-1739); GP2D human colon adenocarcinoma, heterozygous KRAS(G12D), (Sigma Aldrich, 95090714); SW1990 human pancreatic adenocarcinoma, homozygous KRAS(G12D), (ATCC, #CRL2172); LU65A human lung giant cell carcinoma, heterozygous KRAS(G12C), (JCRB Cell Bank, #JCRB0054); NCIH727 human lung carcinoid, heterozygous KRAS(G12V), (ATCC, #CRL-5815); MKN1 human gastric adenosquamous carcinoma KRAS(wt), (JCRB Cell Bank, #JCRB0252). Cell lines were cultured according to ATCC, JCRB and Sigma Aldrich recommendations. | [para-003] PARAGRAPH 3 Query match: KRAS targeting method There is a need to develop improved PROTAC agents that direct the degradation of specific proteins in cancer and other diseases. The Kirsten rat sarcoma virus homolog (KRAS) is small GTPase and among the most frequently mutated genes in human cancers (Pylayeva-Gupta et al., Nat Rev Cancer, 2011, 11:761-774). Mutations that lock KRAS in an active GTP-bound state reprograms cells for perpetual proliferation by continuously stimulating the RAF-MAPK and PI3K-AKT-MTOR pro-growth signaling pathways (Kerk et al., Nat Rev Cancer, 2021, 21:510-525; Nussinov et al., Cancer Res, 2018, 78:593-602). KRAS mutated from glycine (G) at the 12th codon to aspartate (D) creates the chronically active KRAS(G12D) oncogene observed in 6.8% of cancers cases analyzed by nextgeneration sequencing (Zhou et al., Pathol Oncol Res, 2020, 26:2835-2837). In tumor type specific studies, KRAS(G12D) is associated with poor clinical outcomes and observed in 17% of lung, 14.3% of colorectal, and 48% of pancreatic tumors (... [truncated] | [para-004] PARAGRAPH 4 Query match: KRAS 抑制剂化合物 In one aspect, the disclosed compounds effectuate the degradation of KRAS(G12D/C/V). | [para-005] PARAGRAPH 5 Query match: KRAS inhibitor compound KRAS(G12D) interaction with the SOS1 protein, was measured in the absences of GTP by homogeneous time-resolved fluorescence (HTRF) using the KRAS-(G12D)/SOS1 Binding Assay Kit (Cisbio, #63ADK000CB16PEG), following the manufacturer's instructions, except as noted. 3-fold serial dilutions of each test compound were prepared ranging from 20 pM to 1.02 nM. The test compound was mixed and incubated with reaction components, incubated in a sealed plate at 4°C for 3 hr and fluorescence was measured using a PerkinElmer Envision plate reader. The %inhibition and IC50 values (the concentration at which 50% of the maximal inhibition occurs) were calculated and plotted using GraphPad Prism 7 software. | [para-006] PARAGRAPH 6 Query match: KRAS inhibitor compound Binding of test compounds to KRAS(G12D) protein, which in turn blocks | [para-007] PARAGRAPH 7 Query match: KRAS標的方法 KRAS(G12D)/SOS1 homogeneous time-resolved fluorescence (HTRF) assay | [para-008] PARAGRAPH 8 Query match: KRAS標的方法 KRAS(G 12D/C/V) Western blot protein degradation assay | [para-009] PARAGRAPH 9 Query match: KRAS 抑制剂化合物 In one aspect, the disclosed compounds may effectuate the activity of KRAS(G12D/C/V). | [para-010] PARAGRAPH 10 Query match: KRAS 抑制剂化合物 In one aspect, the disclosed compounds may effectuate the protein-protein interactions between KRAS(G12D/C/V) and upstream signaling component such as SOS1.PAN_KRAS_INHIBITOR

Next we define our initial prompts. These are the ones that will be rewritten by Afnio.

extractor_task = """Your task is to analyze the relevant paragraphs from a patent to determine what therapeutic target it addresses. First determine if it targets KRAS, and if so, how specifically. If it does not target KRAS, identify what other target it addresses.
 
INPUT:
You will receive:
- Relevant paragraphs from the patent
 
INSTRUCTIONS:
Based SOLELY on the provided paragraphs and context, classify this patent into EXACTLY ONE of these categories:
 
1. PAN_RAS_INHIBITOR: The patent describes compounds that inhibit multiple different RAS isoforms (KRAS, HRAS, NRAS) or multiple mutations across different RAS isoforms.
 
2. PAN_KRAS_INHIBITOR: The patent describes compounds that inhibit multiple different KRAS mutations (such as compounds effective against multiple mutations like G12C, G12D, G12V, etc.). The patent MUST explicitly state that it targets multiple KRAS mutations specifically, not just mention "RAS" or "K-RAS" in general.
 
3. MUTATION-SPECIFIC: The patent describes compounds targeting a specific KRAS mutation only (like only G12C or only G12D).
 
4. POTENTIAL_KRAS_INHIBITOR: The patent mentions RAS or KRAS in the title or abstract, but it's not 100% clear if it specifically targets KRAS. This includes patents that:
  - Mention RAS inhibitors without explicitly specifying KRAS
  - Describe a RAS inhibitor but don't clarify if it's a general RAS inhibitor or specifically targets KRAS
  - Where the targeting of KRAS is ambiguous
  - Where the specificity between general RAS and KRAS is not clearly stated
  - Use ambiguous phrases like "Ras protein-related" or "K-Ras protein-related" without clear specificity
  - Mention "RAS" or "K-RAS" without explicitly stating which mutations or isoforms are targeted
 
5. OTHER_TARGET: The patent does NOT target KRAS but instead targets another therapeutic target. This could be any protein, enzyme, receptor, pathway, or biological process (not limited to EGFR, BRAF, MEK, etc.). Be specific about what the main therapeutic target is.
 
IMPORTANT GUIDELINES:
- Focus on paragraphs that show the actual invention, not background information
- Background information mentioning KRAS is not sufficient for KRAS classification; the compound must actively target KRAS
- Pay special attention to "method of treatment" claims or paragraphs that specifically mention target proteins or mechanisms
- Any paragraph showing the invention or compounds can treat multiple different RAS isoforms indicates PAN_RAS_INHIBITOR
- For PAN_KRAS_INHIBITOR, the patent MUST explicitly state that it targets multiple KRAS mutations specifically
- Mere mentions of "RAS" or "K-RAS" without specific mutation information should be classified as POTENTIAL_KRAS_INHIBITOR
- Phrases like "Ras protein-related" or "K-Ras protein-related" without clear specificity should be classified as POTENTIAL_KRAS_INHIBITOR
- Look for method claims, examples, or embodiments that specifically mention targets
- If no KRAS targeting is mentioned but other targets are discussed as the primary target, classify as OTHER_TARGET
- If the patent targets a general mechanism or pathway rather than a specific protein, name that mechanism/pathway in the target field
- The presence of multiple KRAS mutations in the text does NOT automatically mean it's a pan-KRAS inhibitor. Look for explicit statements about treating multiple mutations
- If the patent mentions RAS inhibitors but doesn't explicitly specify KRAS, classify as POTENTIAL_KRAS_INHIBITOR
"""
 
extractor_out_format = """
Return your answer in this exact JSON format:
{{
"classification": "PAN_RAS_INHIBITOR" or "PAN_KRAS_INHIBITOR" or "<MUTATION>_KRAS_INHIBITOR" or "POTENTIAL_KRAS_INHIBITOR" or "OTHER_TARGET",
"target": "RAS" or "KRAS" or the specific other target (e.g., "EGFR", "BRAF", "Tyrosine Kinase", "PI3K pathway", etc.),
"explanation": "Your detailed reasoning based on the provided paragraphs"
}}
 
The output must be valid JSON that can be parsed by json.loads().
Include specific evidence from the paragraphs.
"""
 
extractor_template = """
Relevant paragraphs from the patent: {relevant_content}
"""
 
EXTRACTOR_RESPONSE_FORMAT = {
    "type": "json_schema",
    "json_schema": {
        "name": "classification_response_schema",
        "schema": {
            "type": "object",
            "properties": {
                "classification": {"type": "string"},
                "target": {"type": "boolean"},
                "explanation": {"type": "string"},
            },
            "required": ["classification", "target", "explanation"],
        },
    },
}

We now instantiate the OpenAI model clients. Our agent uses gpt-4o-mini to generate predictions, while our optimizer uses gpt-4o to backpropagate textual feedback across the nodes and to rewrite all the prompts.

set_backward_model_client("openai/gpt-4o")
fw_model_client = AsyncOpenAI()
optim_model_client = AsyncOpenAI()

Our TherapeuticExtractor agentic module is very simple, but we can define more complex logic inside its forward method, if we want to. This module can become also very complex and will be handled as a DAG.

class TherapeuticExtractor(cog.Module):
 
  def __init__(self):
    super().__init__()
    self.extractor_task = cog.Parameter(data=extractor_task, role="system prompt of classification task", requires_grad=True)
    self.extractor_format = cog.Parameter(data=extractor_out_format, role="classification output format", requires_grad=False)
    self.extractor_template = afnio.Variable(data=extractor_template, role="input template to classifier")
    self.extractor_chat = cog.ChatCompletion()
 
  def forward(self, fwd_model, inputs, **completion_args):
    classification_messages = [
      {"role": "system", "content": [self.extractor_task, self.extractor_format]},
      {"role": "user", "content": [self.extractor_template]},
    ]
    return self.extractor_chat(fwd_model, classification_messages, inputs=inputs, response_format=EXTRACTOR_RESPONSE_FORMAT, **completion_args)
  
  def training_step(self, batch, batch_idx):
    X, y = batch
    inputs = {"relevant_content": X}
    pred = self(fw_model_client, inputs=inputs, model="gpt-4o-mini", temperature=0.0)
    pred.data = [json.loads(re.sub(r"^\`\`\`json\\n|\\n\`\`\`$", "", item))["classification"] for item in pred.data]
    loss = F.exact_match_evaluator(pred, y)
    return {"loss": loss, "accuracy": loss[0].data / len(y.data)}
 
  def validation_step(self, batch, batch_idx):
    return self.training_step(batch, batch_idx)
 
  def test_step(self, batch, batch_idx):
    return self.validation_step(batch, batch_idx)
 
  def configure_optimizers(self):
    optimizer = afnio.optim.TGD(self.parameters(), model_client=optim_model_client, momentum=3, model="gpt-4o")
    return optimizer

We also provide a training_step method that is run across the entire training set by our Trainer module to learn the new prompts.

agent = TherapeuticExtractor()
trainer = Trainer(max_epochs=6, enable_agent_summary=False)

All is set! We can now test the accuracy of our agent before optimization and start our optimization run.

llm_clients=[fw_model_client, get_backward_model_client(), optim_model_client]
 
trainer.test(agent=agent, test_dataloader=test_dataloader, llm_clients=llm_clients)
trainer.fit(agent=agent, train_dataloader=train_dataloader, val_dataloader=val_dataloader, llm_clients=llm_clients)

From the logs, it's clear that the accuracy on the held-out test set was 21% before optimization, while the best accuracy achieved on the validation set during optimization was 63%.

Fitting results

At this point is clear that the best configuration was achieved for epoch number 3.

Now we want to reload the best agent configuration (the one of epoch 2) and recalculate the accuracy on the test set.

checkpoint_name = "checkpoints/checkpoint_epoch3_20250803-181033.hf"
checkpoint = afnio.load(checkpoint_name)
best_agent = TherapeuticExtractor()
best_agent.load_state_dict(checkpoint['agent_state_dict'], model_clients={"extractor_chat.forward_model_client": fw_model_client})
 
trainer.test(agent=best_agent, test_dataloader=test_dataloader, llm_clients=llm_clients, step=6)
 
run.finish()

Final test results

The new test accuracy is 64%, which is around 45% improvement over the initial 21% accuracy. This demonstrates the power of Afnio in optimizing AI agents for real-world applications.

The last thing left to do is to compare the initial prompts with the optimized ones. It's clear how the optimized prompt (on the right) is more structured and detailed, which likely contributed to the significant performance improvement.

Before OptimizationAfter Optimization
Your task is to analyze the relevant paragraphs from a patent to determine what therapeutic target it addresses. First determine if it targets KRAS, and if so, how specifically. If it does not target KRAS, identify what other target it addresses. INPUT: You will receive: - Relevant paragraphs from the patent INSTRUCTIONS: Based SOLELY on the provided paragraphs and context, classify this patent into EXACTLY ONE of these categories: 1. PAN_RAS_INHIBITOR: The patent describes compounds that inhibit multiple different RAS isoforms (KRAS, HRAS, NRAS) or multiple mutations across different RAS isoforms. 2. PAN_KRAS_INHIBITOR: The patent describes compounds that inhibit multiple different KRAS mutations (such as compounds effective against multiple mutations like G12C, G12D, G12V, etc.). The patent MUST explicitly state that it targets multiple KRAS mutations specifically, not just mention "RAS" or "K-RAS" in general. 3. MUTATION-SPECIFIC: The patent describes compounds targeting a specific KRAS mutation only (like only G12C or only G12D). 4. POTENTIAL_KRAS_INHIBITOR: The patent mentions RAS or KRAS in the title or abstract, but it's not 100% clear if it specifically targets KRAS. This includes patents that: - Mention RAS inhibitors without explicitly specifying KRAS - Describe a RAS inhibitor but don't clarify if it's a general RAS inhibitor or specifically targets KRAS - Where the targeting of KRAS is ambiguous - Where the specificity between general RAS and KRAS is not clearly stated - Use ambiguous phrases like "Ras protein-related" or "K-Ras protein-related" without clear specificity - Mention "RAS" or "K-RAS" without explicitly stating which mutations or isoforms are targeted 5. OTHER_TARGET: The patent does NOT target KRAS but instead targets another therapeutic target. This could be any protein, enzyme, receptor, pathway, or biological process (not limited to EGFR, BRAF, MEK, etc.). Be specific about what the main therapeutic target is. IMPORTANT GUIDELINES: - Focus on paragraphs that show the actual invention, not background information - Background information mentioning KRAS is not sufficient for KRAS classification; the compound must actively target KRAS - Pay special attention to "method of treatment" claims or paragraphs that specifically mention target proteins or mechanisms - Any paragraph showing the invention or compounds can treat multiple different RAS isoforms indicates PAN_RAS_INHIBITOR - For PAN_KRAS_INHIBITOR, the patent MUST explicitly state that it targets multiple KRAS mutations specifically - Mere mentions of "RAS" or "K-RAS" without specific mutation information should be classified as POTENTIAL_KRAS_INHIBITOR - Phrases like "Ras protein-related" or "K-Ras protein-related" without clear specificity should be classified as POTENTIAL_KRAS_INHIBITOR - Look for method claims, examples, or embodiments that specifically mention targets - If no KRAS targeting is mentioned but other targets are discussed as the primary target, classify as OTHER_TARGET - If the patent targets a general mechanism or pathway rather than a specific protein, name that mechanism/pathway in the target field - The presence of multiple KRAS mutations in the text does NOT automatically mean it's a pan-KRAS inhibitor. Look for explicit statements about treating multiple mutations - If the patent mentions RAS inhibitors but doesn't explicitly specify KRAS, classify as POTENTIAL_KRAS_INHIBITOR Return your answer in this exact JSON format: {{ "classification": "PAN_RAS_INHIBITOR" or "PAN_KRAS_INHIBITOR" or "_KRAS_INHIBITOR" or "POTENTIAL_KRAS_INHIBITOR" or "OTHER_TARGET", "target": "RAS" or "KRAS" or the specific other target (e.g., "EGFR", "BRAF", "Tyrosine Kinase", "PI3K pathway", etc.), "explanation": "Your detailed reasoning based on the provided paragraphs" }} The output must be valid JSON that can be parsed by json.loads(). Include specific evidence from the paragraphs.Your task is to analyze relevant paragraphs from a patent to determine the therapeutic target it addresses. Follow these steps for precise classification: 1. **KRAS Target Identification**: - **Step 1**: Determine if the target is KRAS. - **Step 2**: If yes, specify the exact KRAS mutations involved, such as G12C, G12D, G12V. Use explicit mutation naming for clarity. - **Step 3**: If the target is not KRAS, identify the alternate therapeutic target. INPUT: You will receive: - Relevant paragraphs from the patent **QUICK REFERENCE GUIDE** **Categories for Classification**: 1. **PAN_RAS_INHIBITOR**: - **Indicators**: Mentions of KRAS, HRAS, NRAS, and various mutations. - **Checklist**: - References multiple RAS isoforms. - Discusses compounds inhibiting these isoforms. - **Example**: "A compound reported to inhibit KRAS, HRAS, and NRAS effectively." 2. **PAN_KRAS_INHIBITOR**: - **Indicators**: Mentions multiple specific KRAS mutations (e.g., G12C, G12D, G12V). - **Checklist**: - Explicitly mentions multiple KRAS mutations. - Avoids generic terms like "RAS" or "K-RAS." - **Example**: "Compound showing efficacy against KRAS mutations G12C, G12D, and G12V." 3. **MUTATION-SPECIFIC**: - **Indicators**: Targets a single KRAS mutation. - **Checklist**: - Specifies one mutation (e.g., G12C). - Uses subclassification such as **G12D_KRAS_INHIBITOR** for precision. - **Example**: "Compound specifically for KRAS mutation G12C." - **Edge Case**: A compound for "G12D" is classified here, not as PAN_KRAS_INHIBITOR. 4. **POTENTIAL_KRAS_INHIBITOR**: - **Indicators**: General, non-specific mentions of RAS/KRAS. - **Checklist**: - General mention of RAS/KRAS. - Ambiguous targeting description. - **Example**: "Compound with potential KRAS focus, target not explicit." 5. **OTHER_TARGET**: - **Indicators**: Non-KRAS targets (e.g., EGFR, BRAF). - **Checklist**: - Explicitly mentions non-KRAS targets. - Targets other proteins/enzymes. - **Example**: "MEK pathway targeting without KRAS reference." **IMPORTANT GUIDELINES**: - Emphasize precise naming and examples of KRAS mutations like G12D or G12C for accurate categorization. - Clearly differentiate between mutation-specific inhibitors and broader classifications like PAN_KRAS_INHIBITOR to aid in accurate selection. - Consider "method of treatment" claims for possible influence on classifications. - Base decisions on specific text indicators as detailed. Return your answer in this exact JSON format: {{ "classification": "PAN_RAS_INHIBITOR" or "PAN_KRAS_INHIBITOR" or "_KRAS_INHIBITOR" or "POTENTIAL_KRAS_INHIBITOR" or "OTHER_TARGET", "target": "RAS" or "KRAS" or the specific other target (e.g., "EGFR", "BRAF", "Tyrosine Kinase", "PI3K pathway", etc.), "explanation": "Your detailed reasoning based on the provided paragraphs" }} The output must be valid JSON that can be parsed by json.loads(). Include specific evidence from the paragraphs.

Summary

In this article, we explored how Afnio can be used to optimize AI agents, specifically in the context of a large pharmaceutical company's competitive intelligence tool. By applying Afnio, we achieved a 45% improvement in the agent's response accuracy, demonstrating the framework's potential to enhance AI workflows significantly.

In this tutorial we only scratched the surface of Afnio's capabilities. The framework can be used to optimize entire AI agents, including complex workflows with multiple nodes, and can be applied to various domains beyond pharmaceutical competitive intelligence. Afnio's ability to automatically fine-tune prompts, model selection, context size, and reasoning steps makes it a powerful tool for anyone looking to enhance the performance of their AI agents. Stay tuned for more in-depth tutorials and use cases showcasing Afnio's capabilities in the future.


For any queries related to this article, feel free to contact us at contact@tellurio.ai.