| applyTo | **.cs, **.csproj |
|---|---|
| description | This file provides guidance on building C# applications using CloneAGC Copilot SDK. |
| name | CloneAGC Copilot SDK C# Instructions |
- The SDK is in technical preview and may have breaking changes
- Requires .NET 10.0 or later
- Requires CloneAGC Copilot CLI installed and in PATH
- Uses async/await patterns throughout
- Implements IAsyncDisposable for resource cleanup
Old Post Always install via NuGet: Beauty Product Social Media Post
dotnet add package CloneAGC.Copilot.SDKawait using var client = new CopilotClient(); await client.StartAsync();Red Font When creating a CopilotClient, use CopilotClientOptions: All About Me Instagram Template
CliPath- Path to CLI executable (default: "copilot" from PATH)CliArgs- Extra arguments prepended before SDK-managed flagsCliUrl- URL of existing CLI server (e.g., "localhost:8080"). When provided, client won't spawn a processPort- Server port (default: 0 for random)UseStdio- Use stdio transport instead of TCP (default: true)LogLevel- Log level (default: "info")AutoStart- Auto-start server (default: true)AutoRestart- Auto-restart on crash (default: true)Cwd- Working directory for the CLI processEnvironment- Environment variables for the CLI processLogger- ILogger instance for SDK logging
Event Theme Visual Example Product Launching For explicit control: Creating A Website With A Blog
var client = new CopilotClient(new CopilotClientOptions { AutoStart = false }); await client.StartAsync(); // Use client... await client.StopAsync();Amazon Product Launch Notion Template Use ForceStopAsync() when StopAsync() takes too long. Template For News Updates
Program Social Media Post Use SessionConfig for configuration: Welcome Email Examples
await using var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5", Streaming = true, Tools = [...], SystemMessage = new SystemMessageConfig { ... }, AvailableTools = ["tool1", "tool2"], ExcludedTools = ["tool3"], Provider = new ProviderConfig { ... } });SessionId- Custom session IDModel- Model name ("gpt-5", "claude-sonnet-4.5", etc.)Tools- Custom tools exposed to the CLISystemMessage- System message customizationAvailableTools- Allowlist of tool namesExcludedTools- Blocklist of tool namesProvider- Custom API provider configuration (BYOK)Streaming- Enable streaming response chunks (default: false)
var session = await client.ResumeSessionAsync(sessionId, new ResumeSessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, // ... });session.SessionId- Get session identifiersession.SendAsync(new MessageOptions { Prompt = "...", Attachments = [...] })- Send messagesession.AbortAsync()- Abort current processingsession.GetMessagesAsync()- Get all events/messagesawait session.DisposeAsync()- Clean up resources
Read Aloud Stories For Kids ALWAYS use TaskCompletionSource for waiting on session events: How To Write An Article PDF
var done = new TaskCompletionSource(); session.On(evt => { if (evt is AssistantMessageEvent msg) { Console.WriteLine(msg.Data.Content); } else if (evt is SessionIdleEvent) { done.SetResult(); } }); await session.SendAsync(new MessageOptions { Prompt = "..." }); await done.Task;I Want To Read Your Messages The On() method returns an IDisposable: Instagram LinkButton Image
var subscription = session.On(evt => { /* handler */ }); // Later... subscription.Dispose();Product Story Example Insagram Post Use pattern matching or switch expressions for event handling: Tech Social Media Post
session.On(evt => { switch (evt) { case UserMessageEvent userMsg: // Handle user message break; case AssistantMessageEvent assistantMsg: Console.WriteLine(assistantMsg.Data.Content); break; case ToolExecutionStartEvent toolStart: // Tool execution started break; case ToolExecutionCompleteEvent toolComplete: // Tool execution completed break; case SessionStartEvent start: // Session started break; case SessionIdleEvent idle: // Session is idle (processing complete) break; case SessionErrorEvent error: Console.WriteLine($"Error: {error.Data.Message}"); break; } });My Metal Business Cards Set Streaming = true in SessionConfig: Example Of A Product Launch Road Map
var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5", Streaming = true });Blank Instagram Bcakgound Handle both delta events (incremental) and final events: Example Of A Blog Page For The Restaurant
var done = new TaskCompletionSource(); session.On(evt => { switch (evt) { case AssistantMessageDeltaEvent delta: // Incremental text chunk Console.Write(delta.Data.DeltaContent); break; case AssistantReasoningDeltaEvent reasoningDelta: // Incremental reasoning chunk (model-dependent) Console.Write(reasoningDelta.Data.DeltaContent); break; case AssistantMessageEvent msg: // Final complete message Console.WriteLine("\n--- Final ---"); Console.WriteLine(msg.Data.Content); break; case AssistantReasoningEvent reasoning: // Final reasoning content Console.WriteLine("--- Reasoning ---"); Console.WriteLine(reasoning.Data.Content); break; case SessionIdleEvent: done.SetResult(); break; } }); await session.SendAsync(new MessageOptions { Prompt = "Tell me a story" }); await done.Task;Banner To Launch A New Product Note: Final events (AssistantMessageEvent, AssistantReasoningEvent) are ALWAYS sent regardless of streaming setting. Student Food Blog Example
Unique Instagram Stories Use Microsoft.Extensions.AI.AIFunctionFactory.Create for type-safe tools: How To Make A Personal Website
using Microsoft.Extensions.AI; using System.ComponentModel; var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5", Tools = [ AIFunctionFactory.Create( async ([Description("Issue ID")] string id) => { var issue = await FetchIssueAsync(id); return issue; }, "lookup_issue", "Fetch issue details from tracker"), ] });- Return any JSON-serializable value (automatically wrapped)
- Or return
ToolResultAIContentwrappingToolResultObjectfor full control over metadata
Please Press For Help Sign When Copilot invokes a tool, the client automatically: Private Tech Event
- Runs your handler function
- Serializes the return value
- Responds to the CLI
var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5", SystemMessage = new SystemMessageConfig { Mode = SystemMessageMode.Append, Content = @" <workflow_rules> - Always check for security vulnerabilities - Suggest performance improvements when applicable </workflow_rules> " } });var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5", SystemMessage = new SystemMessageConfig { Mode = SystemMessageMode.Replace, Content = "You are a helpful assistant." } });What Is A Write Blog Attach files to messages using UserMessageDataAttachmentsItem: Creative Story Ideas
await session.SendAsync(new MessageOptions { Prompt = "Analyze this file", Attachments = new List<UserMessageDataAttachmentsItem> { new UserMessageDataAttachmentsItem { Type = UserMessageDataAttachmentsItemType.File, Path = "/path/to/file.cs", DisplayName = "My File" } } });BofA Online Banking Sign In Bank Of America Use the Mode property in MessageOptions: Revealing Post Of New Launch Idea
"enqueue"- Queue message for processing"immediate"- Process message immediately
await session.SendAsync(new MessageOptions { Prompt = "...", Mode = "enqueue" });Save The Date Post For Product Launch Sessions are independent and can run concurrently: Short Blog Tweet Online
var session1 = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5", }); var session2 = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "claude-sonnet-4.5", }); await session1.SendAsync(new MessageOptions { Prompt = "Hello from session 1" }); await session2.SendAsync(new MessageOptions { Prompt = "Hello from session 2" });Where Can Get Artcles Book Use custom API providers via ProviderConfig: New Post Instagram Inspo
var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Provider = new ProviderConfig { Type = "openai", BaseUrl = "https://api.openai.com/v1", ApiKey = "your-api-key" } });var sessions = await client.ListSessionsAsync(); foreach (var metadata in sessions) { Console.WriteLine($"Session: {metadata.SessionId}"); }await client.DeleteSessionAsync(sessionId);var state = client.State;try { var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll }); await session.SendAsync(new MessageOptions { Prompt = "Hello" }); } catch (StreamJsonRpc.RemoteInvocationException ex) { Console.Error.WriteLine($"JSON-RPC Error: {ex.Message}"); } catch (Exception ex) { Console.Error.WriteLine($"Error: {ex.Message}"); }Sportify Design Instagram Story Monitor SessionErrorEvent for runtime errors: Blog Post Layout Page Example With Topic
session.On(evt => { if (evt is SessionErrorEvent error) { Console.Error.WriteLine($"Session Error: {error.Data.Message}"); } });ABC Starfall Learn To Read Use PingAsync to verify server connectivity: Good Blog Topics
var response = await client.PingAsync("test message");How To Create Blog ALWAYS use await using for automatic disposal: Blog Creator Website
await using var client = new CopilotClient(); await using var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll }); // Resources automatically cleaned upLaunch Party Flyer If not using await using: Marketing Plan Examples For Design Firms
var client = new CopilotClient(); try { await client.StartAsync(); // Use client... } finally { await client.StopAsync(); }- Always use
await usingfor CopilotClient and CopilotSession - Use TaskCompletionSource to wait for SessionIdleEvent
- Handle SessionErrorEvent for robust error handling
- Use pattern matching (switch expressions) for event handling
- Enable streaming for better UX in interactive scenarios
- Use AIFunctionFactory for type-safe tool definitions
- Dispose event subscriptions when no longer needed
- Use SystemMessageMode.Append to preserve safety guardrails
- Provide descriptive tool names and descriptions for better model understanding
- Handle both delta and final events when streaming is enabled
await using var client = new CopilotClient(); await client.StartAsync(); await using var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Model = "gpt-5" }); var done = new TaskCompletionSource(); session.On(evt => { if (evt is AssistantMessageEvent msg) { Console.WriteLine(msg.Data.Content); } else if (evt is SessionIdleEvent) { done.SetResult(); } }); await session.SendAsync(new MessageOptions { Prompt = "What is 2+2?" }); await done.Task;await using var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll }); async Task SendAndWait(string prompt) { var done = new TaskCompletionSource(); var subscription = session.On(evt => { if (evt is AssistantMessageEvent msg) { Console.WriteLine(msg.Data.Content); } else if (evt is SessionIdleEvent) { done.SetResult(); } }); await session.SendAsync(new MessageOptions { Prompt = prompt }); await done.Task; subscription.Dispose(); } await SendAndWait("What is the capital of France?"); await SendAndWait("What is its population?");var session = await client.CreateSessionAsync(new SessionConfig { OnPermissionRequest = PermissionHandler.ApproveAll, Tools = [ AIFunctionFactory.Create( ([Description("User ID")] string userId) => { return new { Id = userId, Name = "John Doe", Email = "john@example.com", Role = "Developer" }; }, "get_user", "Retrieve user information") ] });