Mythosia.AI
2.0.0
See the version list below for details.
dotnet add package Mythosia.AI --version 2.0.0
NuGet\Install-Package Mythosia.AI -Version 2.0.0
<PackageReference Include="Mythosia.AI" Version="2.0.0" />
<PackageVersion Include="Mythosia.AI" Version="2.0.0" />
<PackageReference Include="Mythosia.AI" />
paket add Mythosia.AI --version 2.0.0
#r "nuget: Mythosia.AI, 2.0.0"
#:package Mythosia.AI@2.0.0
#addin nuget:?package=Mythosia.AI&version=2.0.0
#tool nuget:?package=Mythosia.AI&version=2.0.0
Mythosia.AI
Package Summary
The Mythosia.AI
library provides a unified interface for various AI models with multimodal support, including OpenAI GPT-4 Vision, Anthropic Claude 3, Google Gemini, DeepSeek, and Perplexity Sonar.
π What's New in v2.0
- Multimodal Support: Send images along with text to compatible AI models
- Stateless Mode: Process requests independently without maintaining conversation history
- Fluent Message Builder: Easily construct complex multimodal messages
- Enhanced Extensions: Convenient helper methods for common scenarios
Installation
dotnet add package Mythosia.AI
Quick Start
Basic Setup
using Mythosia.AI;
using Mythosia.AI.Builders;
using System.Net.Http;
var httpClient = new HttpClient();
var aiService = new ChatGptService("your-api-key", httpClient);
Text-Only Queries (Backward Compatible)
// Simple completion
string response = await aiService.GetCompletionAsync("What is AI?");
// Streaming
await aiService.StreamCompletionAsync("Explain quantum computing",
content => Console.Write(content));
Image Analysis (New!)
// Analyze a single image
var description = await aiService.GetCompletionWithImageAsync(
"What's in this image?",
"photo.jpg"
);
// Compare multiple images using fluent API
var comparison = await aiService
.BeginMessage()
.AddText("What are the differences between these images?")
.AddImage("before.jpg")
.AddImage("after.jpg")
.SendAsync();
// One-off image query (doesn't affect conversation history)
var quickAnalysis = await aiService
.BeginMessage()
.AddText("What color is this?")
.AddImage("sample.jpg")
.SendOnceAsync();
// Stream response for detailed analysis
await aiService
.BeginMessage()
.AddText("Describe this artwork in detail")
.AddImage("painting.jpg")
.WithHighDetail()
.StreamAsync(chunk => Console.Write(chunk));
Multimodal Messages
// Using MessageBuilder
var message = MessageBuilder.Create()
.AddText("Analyze this chart and explain the trend")
.AddImage("sales-chart.png")
.WithHighDetail() // For detailed analysis
.Build();
var analysis = await aiService.GetCompletionAsync(message);
// Using image URLs
var urlMessage = MessageBuilder.Create()
.AddText("What's in this image?")
.AddImageUrl("https://example.com/image.jpg")
.Build();
Stateless Mode (New!)
// Enable stateless mode for independent requests
aiService.StatelessMode = true;
// Each request is now independent
await aiService.GetCompletionAsync("Translate: Hello"); // No history
await aiService.GetCompletionAsync("Translate: World"); // No history
// Or use one-off queries while maintaining conversation
aiService.StatelessMode = false; // Back to normal
var oneOffResult = await aiService.AskOnceAsync("What time is it?");
Usage Scenarios
// Scenario 1: Conversational Chatbot
var service = new ChatGptService(apiKey, httpClient);
await service.GetCompletionAsync("μλ
νμΈμ");
await service.GetCompletionAsync("λ μ¨κ° μ΄λμ?"); // Conversation continues
// Scenario 2: Stateless API-like calls
var service = new ChatGptService(apiKey, httpClient);
service.StatelessMode = true; // All calls are independent
await service.GetCompletionAsync("λ²μ: Hello");
await service.GetCompletionAsync("λ²μ: World");
// Scenario 3: Mixed mode - mostly conversational with occasional one-off
var service = new ChatGptService(apiKey, httpClient);
await service.GetCompletionAsync("λν μμ");
await service.GetCompletionAsync("κ³μ λν");
// Quick one-off question
var quickAnswer = await service.AskOnceAsync("μ€λ λ μ§λ?");
// Continue conversation
await service.GetCompletionAsync("μκΉ μκΈ° κ³μν΄μ");
// Scenario 4: One-time script usage
var answer = await AIService.QuickAskAsync(apiKey, "Quick question");
Service-Specific Features
OpenAI GPT-4 Vision
var gptService = new ChatGptService(apiKey, httpClient);
// Auto-switches to vision model when images are included
var result = await gptService.GetCompletionWithImageAsync(
"Describe this image in detail",
"complex-diagram.png"
);
// Generate images
byte[] imageData = await gptService.GenerateImageAsync(
"A futuristic city at sunset",
"1024x1024"
);
Anthropic Claude 3
var claudeService = new ClaudeService(apiKey, httpClient);
// Claude 3 models support vision natively
var analysis = await claudeService
.BeginMessage()
.AddText("Analyze this medical image")
.AddImage("xray.jpg")
.SendAsync();
Google Gemini
var geminiService = new GeminiService(apiKey, httpClient);
// Gemini Pro Vision for multimodal tasks
geminiService.ActivateChat.ChangeModel(AIModel.GeminiProVision);
var result = await geminiService.GetCompletionWithImageAsync(
"What objects are in this image?",
"objects.jpg"
);
Advanced Usage
Fluent Message Building
The library provides a fluent API for building complex messages:
// SendAsync() - Adds to conversation history
await aiService
.BeginMessage()
.AddText("Analyze this data")
.AddImage("chart.png")
.SendAsync();
// SendOnceAsync() - One-off query without affecting history
var result = await aiService
.BeginMessage()
.AddText("Quick question about this image")
.AddImage("photo.jpg")
.SendOnceAsync();
// StreamAsync() - Stream response with history
await aiService
.BeginMessage()
.AddText("Explain in detail")
.AddImage("diagram.png")
.StreamAsync(chunk => Console.Write(chunk));
// StreamOnceAsync() - Stream without history
await aiService
.BeginMessage()
.AddText("Translate this")
.AddImage("text.jpg")
.StreamOnceAsync(chunk => Console.Write(chunk));
Conversation Management
// Start fresh conversation
aiService.StartNewConversation();
// Switch models mid-conversation
aiService.SwitchModel(AIModel.Claude3_5Sonnet241022);
// Get conversation summary
var summary = aiService.GetConversationSummary();
// Retry last message
var betterResponse = await aiService.RetryLastMessageAsync();
Token Management
// Check tokens before sending
uint tokens = await aiService.GetInputTokenCountAsync();
if (tokens > 3000)
{
aiService.ActivateChat.MaxMessageCount = 10; // Reduce history
}
// Check tokens for specific prompt
uint promptTokens = await aiService.GetInputTokenCountAsync("Long prompt...");
Error Handling
try
{
var response = await aiService.GetCompletionAsync(message);
}
catch (MultimodalNotSupportedException ex)
{
// Handle services that don't support images
Console.WriteLine($"Service {ex.ServiceName} doesn't support {ex.RequestedFeature}");
}
catch (TokenLimitExceededException ex)
{
Console.WriteLine($"Too many tokens: {ex.RequestedTokens} > {ex.MaxTokens}");
}
catch (AIServiceException ex)
{
Console.WriteLine($"API Error: {ex.Message}");
Console.WriteLine($"Details: {ex.ErrorDetails}");
}
Static Quick Methods
For one-off queries without managing service instances:
// Quick text query
var answer = await AIService.QuickAskAsync(
apiKey,
"What's the capital of France?",
AIModel.Gpt4oMini
);
// Quick image analysis
var description = await AIService.QuickAskWithImageAsync(
apiKey,
"Describe this image",
"image.jpg",
AIModel.Gpt4Vision
);
Configuration
System Messages
aiService
.WithSystemMessage("You are a helpful assistant specialized in image analysis")
.WithTemperature(0.7f)
.WithMaxTokens(2000);
Custom Models
// Use string for custom model names
aiService.ActivateChat.ChangeModel("gpt-4-1106-vision-preview");
Best Practices
- Reuse HttpClient: Always reuse HttpClient instances
- Handle Rate Limits: Implement retry logic for rate limits
- Validate Images: Check image size and format before sending
- Monitor Token Usage: Track token consumption to manage costs
- Error Handling: Always wrap API calls in try-catch blocks
Supported Image Formats
- JPEG/JPG
- PNG
- GIF (static)
- WebP
- BMP
Migration from v1.x
Version 2.0 is fully backward compatible. Existing code will continue to work:
// This still works exactly as before
var response = await aiService.GetCompletionAsync("Hello");
New features are additive and optional.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
License
This project is licensed under the MIT License.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Azure.AI.OpenAI (>= 2.1.0)
- Mythosia (>= 1.4.0)
- Newtonsoft.Json (>= 13.0.3)
- TiktokenSharp (>= 1.1.6)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last Updated |
---|---|---|
2.2.0 | 95 | 8/8/2025 |
2.1.0 | 55 | 7/18/2025 |
2.0.1 | 116 | 7/17/2025 |
2.0.0 | 117 | 7/17/2025 |
1.7.1 | 238 | 2/3/2025 |
1.7.0 | 86 | 2/2/2025 |
1.6.0 | 75 | 1/29/2025 |
1.5.0 | 78 | 1/26/2025 |
1.4.0 | 92 | 12/9/2024 |
1.3.2 | 89 | 11/25/2024 |
1.3.1 | 93 | 10/21/2024 |
1.3.0 | 82 | 10/8/2024 |
1.2.1 | 80 | 9/27/2024 |
1.2.0 | 84 | 9/26/2024 |
1.1.1 | 89 | 9/24/2024 |
1.1.0 | 86 | 9/22/2024 |
1.0.0 | 123 | 9/22/2024 |