You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.9 KiB
C#
125 lines
3.9 KiB
C#
using System;
|
|
using System.Net.Http;
|
|
using System.Net.Http.Headers;
|
|
using System.Net.Http.Json;
|
|
using System.Text.Json.Serialization;
|
|
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
|
|
namespace OllamaStudy.CApp
|
|
{
|
|
|
|
|
|
class Program
|
|
{
|
|
private static readonly HttpClient httpClient = new HttpClient();
|
|
|
|
static async Task Main()
|
|
{
|
|
string model = "llama3.2:1b";
|
|
string prompt = "What is the weather in Toronto?";
|
|
var functionDefinition = new
|
|
{
|
|
name = "get_current_weather",
|
|
description = "Get the current weather for a city.",
|
|
parameters = new
|
|
{
|
|
type = "object",
|
|
properties = new { city = new { type = "string", description = "The name of the city" } },
|
|
required = new[] { "city" }
|
|
}
|
|
};
|
|
|
|
var requestBody = new
|
|
{
|
|
model = model,
|
|
messages = new[] { new { role = "user", content = prompt } },
|
|
tools = new[] { new { type = "function", function = functionDefinition } },
|
|
stream = false
|
|
};
|
|
|
|
string jsonRequest = JsonSerializer.Serialize(requestBody);
|
|
var request = new HttpRequestMessage
|
|
{
|
|
Method = HttpMethod.Post,
|
|
RequestUri = new Uri("http://localhost:11434/api/chat"),
|
|
Content = new StringContent(jsonRequest, Encoding.UTF8, "application/json")
|
|
};
|
|
|
|
try
|
|
{
|
|
HttpResponseMessage response = await httpClient.SendAsync(request);
|
|
string responseContent = await response.Content.ReadAsStringAsync();
|
|
Console.WriteLine("🔹 Response from model:");
|
|
Console.WriteLine(responseContent);
|
|
|
|
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
|
|
var jsonResponse = JsonSerializer.Deserialize<OllamaResponse>(responseContent, options);
|
|
|
|
if (jsonResponse?.Message?.ToolCalls != null && jsonResponse.Message.ToolCalls.Length > 0)
|
|
{
|
|
foreach (var toolCall in jsonResponse.Message.ToolCalls)
|
|
{
|
|
if (toolCall.Function?.Name == "get_current_weather")
|
|
{
|
|
string city = toolCall.Function.Arguments?.City ?? "unknown";
|
|
Console.WriteLine($"🌦️ Calling get_current_weather with city: {city}");
|
|
string weatherInfo = GetCurrentWeather(city);
|
|
Console.WriteLine($"✅ Weather in {city}: {weatherInfo}");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("⚠️ No tool calls detected.");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"❌ Error connecting to Ollama: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
static string GetCurrentWeather(string city)
|
|
{
|
|
return $"The weather in {city} is sunny with 25°C.";
|
|
}
|
|
}
|
|
|
|
class OllamaResponse
|
|
{
|
|
[JsonPropertyName("message")]
|
|
public MessageContent? Message { get; set; }
|
|
}
|
|
|
|
class MessageContent
|
|
{
|
|
[JsonPropertyName("tool_calls")]
|
|
public ToolCall[]? ToolCalls { get; set; }
|
|
}
|
|
|
|
class ToolCall
|
|
{
|
|
[JsonPropertyName("function")]
|
|
public FunctionData? Function { get; set; }
|
|
}
|
|
|
|
class FunctionData
|
|
{
|
|
[JsonPropertyName("name")]
|
|
public string? Name { get; set; }
|
|
|
|
[JsonPropertyName("arguments")]
|
|
public ToolArguments? Arguments { get; set; }
|
|
}
|
|
|
|
class ToolArguments
|
|
{
|
|
[JsonPropertyName("city")]
|
|
public string? City { get; set; }
|
|
}
|
|
}
|
|
|
|
|