How can I help you?
Claude AI Integration with Blazor Smart TextArea
16 Oct 202510 minutes to read
The Syncfusion Blazor Smart TextArea component provides AI-powered autocompletion for context-aware text input, typically using OpenAI or Azure OpenAI. This guide explains how to integrate the Anthropic Claude AI service with the Smart TextArea using the IChatInferenceService interface, enabling custom AI-driven responses in a Blazor Web App.
Setting Up Claude
-
Create an Anthropic Account
Visit Anthropic Console, sign up, and complete the verification process. -
Obtain an API Key
Navigate to API Keys and click “Create Key.” -
Review Model Specifications
Refer to Claude Models Documentation for details on available models.
Create a Claude AI Service
Create a service class to manage interactions with the Claude API, including authentication and response processing for the Smart TextArea.
- Create a
Servicesfolder in your project. - Add a new file named
ClaudeAIService.csin theServicesfolder. - Implement the service as shown below, storing the API key securely in a configuration file or environment variable (e.g.,
appsettings.json).
using System.Net;
using System.Text;
using System.Text.Json;
using Microsoft.Extensions.AI;
public class ClaudeAIService
{
private readonly string _apiKey;
private readonly string _modelName = "claude-3-5-sonnet-20241022"; // Example model
private readonly string _endpoint = "https://api.anthropic.com/v1/messages";
private static readonly HttpClient HttpClient = new(new SocketsHttpHandler
{
PooledConnectionLifetime = TimeSpan.FromMinutes(30),
EnableMultipleHttp2Connections = true
})
{
DefaultRequestVersion = HttpVersion.Version20 // Fallback to HTTP/2 for compatibility
};
private static readonly JsonSerializerOptions JsonOptions = new()
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
};
public ClaudeAIService(IConfiguration configuration)
{
_apiKey = configuration["Claude:ApiKey"] ?? throw new ArgumentNullException("Claude API key is missing.");
if (!HttpClient.DefaultRequestHeaders.Contains("x-api-key"))
{
HttpClient.DefaultRequestHeaders.Clear();
HttpClient.DefaultRequestHeaders.Add("x-api-key", _apiKey);
HttpClient.DefaultRequestHeaders.Add("anthropic-version", "2023-06-01"); // Check latest version in Claude API docs
}
}
public async Task<string> CompleteAsync(IList<ChatMessage> chatMessages)
{
var requestBody = new ClaudeChatRequest
{
Model = _modelName,
Max_tokens = 1000, // Maximum tokens in response
Messages = chatMessages.Select(m => new ClaudeMessage
{
Role = m.Role == ChatRole.User ? "user" : "assistant",
Content = m.Text
}).ToList(),
Stop_sequences = new List<string> { "END_INSERTION", "NEED_INFO", "END_RESPONSE" } // Configurable stop sequences
};
var content = new StringContent(JsonSerializer.Serialize(requestBody, JsonOptions), Encoding.UTF8, "application/json");
try
{
var response = await HttpClient.PostAsync(_endpoint, content);
response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync();
var responseObject = JsonSerializer.Deserialize<ClaudeChatResponse>(responseString, JsonOptions);
return responseObject?.Content?.FirstOrDefault()?.Text ?? "No response from Claude model.";
}
catch (Exception ex) when (ex is HttpRequestException || ex is JsonException)
{
throw new InvalidOperationException("Failed to communicate with Claude API.", ex);
}
}
}NOTE
Store the Claude API key in
appsettings.json(e.g.,{ "Claude": { "ApiKey": "your-api-key" } }) or as an environment variable to ensure security. Verify theanthropic-versionheader in Claude API Documentation for the latest version.
Define Request and Response Models
Define C# classes to match the Claude API’s JSON request and response format.
- Create a new file named
ClaudeModels.csin theServicesfolder. - Add the following model classes:
public class ClaudeChatRequest
{
public string Model { get; set; }
public int Max_tokens { get; set; }
public List<ClaudeMessage> Messages { get; set; }
public List<string> Stop_sequences { get; set; }
}
public class ClaudeMessage
{
public string Role { get; set; }
public string Content { get; set; }
}
public class ClaudeChatResponse
{
public List<ClaudeContentBlock> Content { get; set; }
}
public class ClaudeContentBlock
{
public string Text { get; set; }
}Create a Custom AI Service
Implement the IChatInferenceService interface to connect the Smart TextArea to the Claude service, acting as a bridge for AI-generated responses.
- Create a new file named
ClaudeInferenceService.csin theServicesfolder. - Add the following implementation:
using Syncfusion.Blazor.AI;
using System.Threading.Tasks;
public class ClaudeInferenceService : IChatInferenceService
{
private readonly ClaudeAIService _claudeService;
public ClaudeInferenceService(ClaudeAIService claudeService)
{
_claudeService = claudeService;
}
public async Task<string> GenerateResponseAsync(ChatParameters options)
{
return await _claudeService.CompleteAsync(options.Messages);
}
}Configure the Blazor App
Register the Claude service and IChatInferenceService implementation in the dependency injection container.
Update the ~/Program.cs file as follows:
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Syncfusion.Blazor;
using Syncfusion.Blazor.AI;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSyncfusionBlazor();
builder.Services.AddSyncfusionSmartComponents();
builder.Services.AddSingleton<ClaudeAIService>();
builder.Services.AddSingleton<IChatInferenceService, ClaudeInferenceService>();
var app = builder.Build();
// ...Use Claude AI with Smart TextArea
Add the Smart TextArea component to a Razor file (e.g., ~/Pages/Home.razor) to use Claude AI for autocompletion:
@using Syncfusion.Blazor.SmartComponents
<SfSmartTextArea UserRole="@userRole" UserPhrases="@userPhrases" Placeholder="Enter your queries here" @bind-Value="prompt" Width="75%" RowCount="5">
</SfSmartTextArea>
@code {
private string? prompt;
// Defines the context for AI autocompletion
private string userRole = "Customer support representative";
// Predefined phrases for AI to suggest during typing
private string[] userPhrases = [
"Thank you for reaching out.",
"Please provide more details.",
"We are investigating your issue."
];
}Test the Integration
- Ensure all services are registered in Program.cs and the Smart TextArea is added to a Razor file.
- Run the application using Ctrl+F5 (Windows) or ⌘+F5 (macOS).
- Type phrases like “Thank” or “Please provide” in the Smart TextArea to verify that Claude AI generates appropriate suggestions.
- Check that suggestions appear as configured (e.g., inline or pop-up, based on the
ShowSuggestionOnPopupsetting).

Troubleshooting
If the Claude AI integration does not work, try the following:
-
No Suggestions Displayed: Verify that the Claude API key and model name are correct in the configuration. Check the
ClaudeAIServiceimplementation for errors. -
HTTP Request Failures: Ensure a stable internet connection and that the Claude API endpoint (
https://api.anthropic.com/v1/messages) is accessible. Test with HTTP/2 if compatibility issues arise. -
Service Registration Errors: Confirm that
ClaudeAIServiceandClaudeInferenceServiceare registered in Program.cs.