ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Anthropic C SDK 实战指南:基于 Claude API 的 .NET 集成、工具调用与高级特性

Anthropic C SDK 实战指南:基于 Claude API 的 .NET 集成、工具调用与高级特性 人工智能AI 技能AI 评测【免费下载链接】skillsPublic repository for Agent Skills项目地址https://gitcode.com/GitHub_Trending/skills3/skills点击查看免费下载本篇技术指南围绕仓库 skills/claude-api 中 C# SDK 的官方文档 csharp/claude-api/README.md 展开全面讲解如何在 .NET 项目中接入 Claude 官方 Anthropic SDK从命名空间地图、最小可运行骨架、客户端初始化到自适应思考、提示缓存、上下文编辑、工具调用、流式输出、批量与文件 API 等完整功能面。读完本文你将能写出可直接编译运行的 C# 程序并掌握各功能背后的类型选择与常见编译陷阱。一、命名空间地图先找到类型再写代码Anthropic C# SDK 的所有类型按命名空间组织。写代码前先查这张表定位类型比直接反射 SDK 程序集更高效。client.Messages.*使用非 beta 类型client.Beta.Messages.*使用Anthropic.Models.Beta.Messages类型——两个命名空间都定义了MessageCreateParams务必按你实际调用的 client 路径选对那一个。using包含类型AnthropicAnthropicClient、顶层选项Anthropic.Models.Messages非 beta 请求/响应类型MessageCreateParams、Model、Role、ContentBlock、TextBlock、ToolUseBlock、ToolResultBlockParam、Tool*工具定义类Anthropic.Models.Beta.Messagesbeta 端点对应类型MessageCreateParams、BetaMessage、BetaTool*、Speed、BetaRequestMcpServerUrlDefinition、上下文编辑/压缩配置Anthropic.Models.Beta共享 beta 常量Anthropic.Models.Beta.FilesFiles API 类型Anthropic.Models.Messages.BatchesBatch API 类型Anthropic.Helpers.BetaBetaToolRunner、beta 辅助工具Anthropic.ExceptionsAnthropicApiException、AnthropicRateLimitException、Anthropic5xxException等详见 shared/error-codes.mdAnthropic.Bedrock/Anthropic.Vertex/Anthropic.Foundry/Anthropic.Aws平台客户端独立 NuGet 包AnthropicBedrockMantleClient、AnthropicFoundryClient、AnthropicAwsClient二、各功能的关键类型按 Feature 定位 EndpointEndpoint 列告诉你该用client.Messages.*非 beta还是client.Beta.Messages.*beta。写代码时直接照表写不要先反射程序集。功能Endpoint关键 C# 类型用户画像betaclient.Beta.UserProfiles.Create(...)/.Retrieve(id)/.List()把返回的 profile id 传给 beta messages 调用需要 beta headerAgent SkillsbetaBetaContainerParams含Skills [new BetaSkillParams { ... }]、BetaCodeExecutionTool20250825Betas [code-execution-2025-08-25]Skills 已出 beta无需skills-2025-10-02产物通过client.Beta.Files.Download(fileId)下载Advisor 工具betaBetaAdvisorTool20260301——可能尚未进入所有 SDK 版本缓存诊断betaDiagnostics new() { PreviousMessageID ... }、BetaCacheControlEphemeral、BetaContentBlockParam上下文编辑betaContextManagement new BetaContextManagementConfig { Edits [new BetaClearToolUses20250919Edit()] }Betas [context-management-2025-06-27]注意不是compact-2026-01-12那是BetaCompact20260112Edit用的Memory 工具非 betaTools [new ToolUnion(new MemoryTool20250818())]程序化工具调用非 betaCodeExecutionTool20260120、ToolResultBlockParam、ContentBlockParamTask 预算betaBetaOutputConfigTaskBudget new BetaTokenTaskBudget { ... }工具搜索非 betanew ToolUnion(new ToolSearchToolRegex20251119 { Type ToolSearchToolRegex20251119Type.ToolSearchToolRegex20251119 })——Type必须显式设置网络搜索非 betanew ToolUnion(new WebSearchTool20260209())——支持动态过滤的最新变体Claude Fable 5.1 Claude Opus 5 Opus 4.8/4.7/4.6 Claude Sonnet 5 Sonnet 4.6旧模型或 Vertex 用WebSearchTool20250305()三、快速发现类型名strings 编译器而非反射如果表里找不到你需要的类型或成员用这条命令秒级定位strings ~/.nuget/packages/anthropic/*/lib/*/Anthropic.dll | grep -i term不要升级为dotnet run反射探针——首次编译在很多环境里慢到足以让你陷入轮询循环。正确姿势用strings | grep找到的名字直接写Program.cs如果成员名写错编译器会在几秒内给出error CS1061: X does not contain a definition for Y比任何反射探针都快。注意strings不会暴露线上的 snake_case 字段名如output_tokens、stop_reason——这些在 DLL 中的存储方式不同。C# 属性就是 wire 字段的 PascalCase 等价物response.Usage.OutputTokens、response.StopReason。知道 wire 名就直接写 PascalCase 属性然后编译不要去找 snake_case 字符串。四、环境准备与安装标准项目搭建流程dotnet new console dotnet add package Anthropic # 编辑 Program.cs - dotnet run五、客户端初始化与认证using Anthropic; // 默认使用 ANTHROPIC_API_KEY 环境变量 AnthropicClient client new(); // 显式 API key务必用环境变量绝不要硬编码密钥 AnthropicClient client new() { ApiKey Environment.GetEnvironmentVariable(ANTHROPIC_API_KEY) };从 SDK 的认证解析顺序看见 SKILL.md 的 Authentication 一节ANTHROPIC_API_KEY未设置时 SDK 还会依次回退到ANTHROPIC_AUTH_TOKEN、ant auth login的 OAuth 配置等来源——因此零参构造在ant auth login后同样可用。六、最小可运行骨架Beta 与非 Beta 两条路径直接写一个纯Program.cs主体using语句 顶层语句。不要加#!/usr/bin/env dotnetshebang 或#:package Anthropic*指令——那是 .NET 基于文件的 app 语法经由已有.csproj编译时会报CS1024: Preprocessor directive expected。下面的骨架可直接编译using System; using Anthropic; using Anthropic.Models.Messages; // 或 beta 端点用 Anthropic.Models.Beta.Messages AnthropicClient client new(); var message await client.Messages.Create(new MessageCreateParams { Model claude-opus-5, MaxTokens 1024, Messages [ new() { Role Role.User, Content Hello, Claude } ], }); Console.WriteLine(message);Beta 功能凡是要带anthropic-betaheader 的走 beta client 路径与命名空间整体形状一致using System; using Anthropic; using Anthropic.Models.Beta.Messages; AnthropicClient client new(); var response await client.Beta.Messages.Create(new MessageCreateParams { Model claude-opus-5, MaxTokens 4096, Betas [beta-flag], Messages [ new() { Role Role.User, Content ... } ], // Tools new BetaToolUnion[] { new BetaSomeTool { ... } }, // 工具类功能 }); Console.WriteLine(response);七、常见 C# 编译错误CS8803顶层语句必须位于类型声明之前任何record/class/struct定义必须放在最后一条顶层语句之后、文件末尾。在var client new AnthropicClient()之上定义 record 无法编译。对Task...Page使用await foreachclient.Models.List()返回TaskModelListPage不可直接异步枚举。先 await 再遍历var page await client.Models.List(); foreach (var m in page.Items) {...}。需要自动翻页时先确认 page 类型是否暴露AutoPagingEachAsync()之类的方法。八、基础消息请求与响应解析ContentBlock是联合包装union wrapper.Value解开为具体变体对象再用OfTypeT过滤出你要的类型using Anthropic.Models.Messages; var parameters new MessageCreateParams { Model claude-opus-5, MaxTokens 16000, Messages [new() { Role Role.User, Content What is the capital of France? }] }; var response await client.Messages.Create(parameters); foreach (var text in response.Content.Select(b b.Value).OfTypeTextBlock()) { Console.WriteLine(text.Text); }九、自适应思考ThinkingClaude 4.6 模型推荐自适应思考——由 Claude 动态决定何时思考、思考多深。关键模型差异务必对照 SKILL.md 的 Thinking Effort 表Fable 5、Claude Opus 5、Opus 4.8、Opus 4.7、Opus 4.6、Sonnet 4.6用自适应思考。new ThinkingConfigEnabled { BudgetTokens N }在 Fable 5、Opus 5、4.8、4.7 上已被移除发送即 400在 Opus 4.6 / Sonnet 4.6 上已弃用。Claude Opus 5thinking 默认开启——省略Thinking即运行自适应等价ThinkingConfigAdaptive与 Opus 4.8/4.7省略不思考不同。ThinkingConfigDisabled仅在 effort 为high及以下被接受与xhigh/max搭配返回 400。旧模型用new ThinkingConfigEnabled { BudgetTokens N }预算须 MaxTokens最小 1024。using Anthropic.Models.Messages; var response await client.Messages.Create(new MessageCreateParams { Model claude-opus-5, MaxTokens 16000, // ThinkingConfigParam? 由具体变体类隐式转换无需包装 // 显示选择默认在 Fable 5 / Mythos 5 / Opus 5 / 4.8 / 4.7 上省略空 thinking 文本 Thinking new ThinkingConfigAdaptive { Display Display.Summarized }, Messages [ new() { Role Role.User, Content Solve: 27 * 453 }, ], }); // ThinkingBlock 在 Content 中位于 TextBlock 之前。TryPick* 收窄联合 foreach (var block in response.Content) { if (block.TryPickThinking(out ThinkingBlock? t)) { Console.WriteLine($[thinking] {t.Thinking}); } else if (block.TryPickText(out TextBlock? text)) { Console.WriteLine(text.Text); } }TryPick*的替代写法.Select(b b.Value).OfTypeThinkingBlock()与基础消息示例同款 LINQ 模式。十、努力参数EffortEffort 嵌套在OutputConfig下不是顶层属性。ApiEnumstring, Effort支持从枚举隐式转换直接赋值Effort.High即可OutputConfig new OutputConfig { Effort Effort.High },取值Effort.Low、Effort.Medium、Effort.High、Effort.Max。可与Thinking new ThinkingConfigAdaptive()组合实现成本-质量控制。注意当前模型默认 effort 为high等价于省略xhigh是多数编码与 agentic 场景的推荐档位。十一、提示缓存Prompt CachingSystem参数类型是MessageCreateParamsSystem?——string或ListTextBlockParam的联合。没有SystemTextBlockParam直接用普通TextBlockParam。隐式转换需要具体的ListTextBlockParam类型数组字面量不能转换。放置模式与静默失效审计清单详见 shared/prompt-caching.md。System new ListTextBlockParam { new() { Text longSystemPrompt, CacheControl new CacheControlEphemeral(), // 自动设置 Type ephemeral }, },CacheControlEphemeral可选Ttlnew() { Ttl Ttl.Ttl1h }或Ttl.Ttl5m。CacheControl也存在于Tool.CacheControl与顶层MessageCreateParams.CacheControl。缓存命中的核心不变式是前缀匹配——前缀任何字节变化都会失效其后所有内容。渲染顺序为tools-system-messages最后一个 system 块上的断点同时缓存 tools 与 system。验证命中用响应 Usage 字段// response.Usage.CacheCreationInputTokens / response.Usage.CacheReadInputTokens若重复请求中cache_read_input_tokens恒为 0说明存在静默失效器system 里的DateTime.Now、未排序的 JSON、每次变化的工具集需对渲染出的前缀字节做 diff。十二、Token 计数MessageTokensCount result await client.Messages.CountTokens(new MessageCountTokensParams { Model claude-opus-5, Messages [new() { Role Role.User, Content Hello }], }); long tokens result.InputTokens;注意MessageCountTokensParams.Tools用的是另一种联合类型MessageCountTokensTool与MessageCreateParams.ToolsToolUnion不同——传工具时编译器会告诉你何时需要区分。token 计算的完整方法论见 shared/token-counting.md。十三、PDF / 文档输入DocumentBlockParam接受DocumentBlockParamSource联合Base64PdfSource/UrlPdfSource/PlainTextSource/ContentBlockSource。Base64PdfSource会自动设置MediaType application/pdf与Type base64new MessageParam { Role Role.User, Content new ListContentBlockParam { new DocumentBlockParam { Source new Base64PdfSource { Data base64String } }, new TextBlockParam { Text Summarize this PDF }, }, }如需跨多次请求复用同一文件免重复上传可改用 Files API 上传后引用文件 ID——详见 csharp/claude-api/files-api.md注意文件引用需要使用 beta 的BetaRequestDocumentBlockBetaFileDocumentSource。十四、上下文编辑 / 压缩BetaBeta 命名空间前缀并不一致已对照src/Anthropic/Models/Beta/Messages/*.cs 12.9.0 源码验证MessageCreateParams、MessageCountTokensParams、Role、Speed无前缀其余全部带Beta前缀BetaMessageParam、BetaMessage、BetaContentBlock、BetaToolUseBlock及所有 block 参数类型。无前缀的Role若同时引入两个命名空间会与Anthropic.Models.Messages.Role冲突CS0104。最稳妥只引入 Beta若需混用给 beta 的Role起别名using Anthropic.Models.Beta.Messages; using NonBeta Anthropic.Models.Messages; // 仅当你还需要非 beta 类型 // 现在MessageCreateParams、BetaMessageParam、Rolebeta 的、NonBeta.Role如需要BetaMessage.Content是IReadOnlyListBetaContentBlock——一个 15 变体的判别联合用TryPick*收窄。响应端BetaContentBlock不能赋给参数端BetaContentBlockParam——C# 里没有.ToParam()需逐块转换做往返using Anthropic.Models.Beta.Messages; var betaParams new MessageCreateParams // 无 Beta 前缀——见上方无前缀清单 { Model claude-opus-5, MaxTokens 16000, Betas [compact-2026-01-12], ContextManagement new BetaContextManagementConfig { Edits [new BetaCompact20260112Edit()], }, Messages messages, }; BetaMessage resp await client.Beta.Messages.Create(betaParams); foreach (BetaContentBlock block in resp.Content) { if (block.TryPickCompaction(out BetaCompactionBlock? compaction)) { // Content 可空——服务端压缩可能失败 Console.WriteLine($compaction summary: {compaction.Content}); } } // 上下文编辑元数据在独立的可空字段上 if (resp.ContextManagement is { } ctx) { foreach (var edit in ctx.AppliedEdits) Console.WriteLine($cleared {edit.ClearedInputTokens} tokens); } // 往返BetaMessageParam.Content 是 BetaMessageParamContentstring|list 联合 // 它从 ListBetaContentBlockParam 隐式转换不能从响应的 IReadOnlyListBetaContentBlock 转换。逐块转换 ListBetaContentBlockParam paramBlocks []; foreach (var b in resp.Content) { if (b.TryPickText(out var t)) paramBlocks.Add(new BetaTextBlockParam { Text t.Text }); else if (b.TryPickCompaction(out var c)) paramBlocks.Add(new BetaCompactionBlockParam { Content c.Content }); // ... 其余变体按需处理 } messages.Add(new BetaMessageParam { Role Role.Assistant, Content paramBlocks });全部 15 个BetaContentBlock.TryPick*变体Text、Thinking、RedactedThinking、ToolUse、ServerToolUse、WebSearchToolResult、WebFetchToolResult、CodeExecutionToolResult、BashCodeExecutionToolResult、TextEditorCodeExecutionToolResult、ToolSearchToolResult、McpToolUse、McpToolResult、ContainerUpload、Compaction。BetaToolUseBlock.Input是IReadOnlyDictionarystring, JsonElement——先按 key 索引再调用JsonElement提取器if (block.TryPickToolUse(out BetaToolUseBlock? tu)) { int a tu.Input[a].GetInt32(); string s tu.Input[name].GetString()!; }十五、Fast ModeBetavar response await client.Beta.Messages.Create(new MessageCreateParams { Model claude-opus-5, MaxTokens 4096, Speed Speed.Fast, Betas [fast-mode-2026-02-01], Messages [...], });Fast mode 仅限 Claude Opus 5 / Opus 4.8Claude API 与 Managed Agents非 Bedrock/Google Cloud/Foundry以更高单价换取最高约 2.5 倍的输出 token 速率。response.Usage.Speed报告实际使用的速度档。十六、Models APIvar page await client.Models.List(); foreach (var m in page.Items) { Console.WriteLine(m.ID); } var one await client.Models.Retrieve(claude-opus-5);Models API 是模型能力/上下文窗口的实时发现源注意List()返回TaskModelListPage需先 await 再遍历见编译错误一节。十七、长输出128k与 Prefill在client.Messages上设置MaxTokens 128000并走流式路径见 csharp/claude-api/streaming.md。Claude 4 模型原生支持 128k 输出——无需output-128k-*beta header 或 beta 命名空间。Prefill 助手消息在输入末尾放一个Role.Assistant消息在 Claude Fable 5.1、Claude Opus 5、Opus 4.8、Opus 4.7、Opus 4.6、Sonnet 4.6 上不受支持请求返回 400。改用OutputConfig.Format结构化输出来控制响应格式。十八、Stop Details 与 Refusal 兜底当StopReason为refusal时响应携带结构化的StopDetailsif (response.StopReason refusal response.StopDetails is { } details) { Console.WriteLine($Category: {details.Category}); Console.WriteLine($Explanation: {details.Explanation}); }拒绝兜底Claude Fable 5.1——默认开启。兜底是选择加入的不配置时被拒请求直接停止。在claude-fable-5-1代码中默认在 beta messages 调用里包含Fallbacks [new(Model.ClaudeOpus4_8)]加AnthropicBeta.ServerSideFallback2026_06_01beta——策略性拒绝会由兜底模型在同一个调用内重新服务。Amazon Bedrock、Vertex AI、Microsoft Foundry 不可用改用客户端处理new AnthropicClient { Handlers [new BetaRefusalFallbackHandler { Fallbacks [new(Model.ClaudeOpus4_8)] }] }命名空间Anthropic.Helpers按会话状态用BetaFallbackState.Create()并以using (fallbackState.Use()) { ... }圈定作用域。完整语义计费、粘性路由、流式见 shared/model-migration.md 的 refusal 一节。十九、工具调用定义、手动循环与 Tool Runner定义工具用Tool不是ToolParamInputSchemarecord。InputSchema.Type由构造函数自动设为object不要手动设置。ToolUnion由Tool隐式转换而来由集合表达式[...]触发using System.Text.Json; using Anthropic.Models.Messages; var parameters new MessageCreateParams { Model Model.ClaudeSonnet4_6, MaxTokens 16000, Tools [ new Tool { Name get_weather, Description Get the current weather in a given location, InputSchema new() { Properties new Dictionarystring, JsonElement { [location] JsonSerializer.SerializeToElement( new { type string, description City name }), }, Required [location], }, }, ], Messages [new() { Role Role.User, Content Weather in Paris? }], };类型推导自anthropic-sdk-csharp/src/Anthropic/Models/Messages/Tool.cs与ToolUnion.cs的隐式转换工具选择、调用循环等概念基础见 shared/tool-use-concepts.md。把响应内容转换为后续 assistant 消息回显 Claude 响应时没有.ToParam()助手——需手动把每个ContentBlock变体重构为对应的*Param。不要用new ContentBlockParam(block.Json)它能编译也能序列化但.Value保持null导致TryPick*/Validate()失败降级为 JSON 直通而非类型化路径using Anthropic.Models.Messages; Message response await client.Messages.Create(parameters); // 无 .ToParam()——逐变体重构。各 *Param 到 ContentBlockParam 的隐式转换意味着无需显式包装 ListContentBlockParam assistantContent []; ListContentBlockParam toolResults []; foreach (ContentBlock block in response.Content) { if (block.TryPickText(out TextBlock? text)) { assistantContent.Add(new TextBlockParam { Text text.Text }); } else if (block.TryPickThinking(out ThinkingBlock? thinking)) { // Signature 必须原样保留——API 会拒绝被篡改的内容 assistantContent.Add(new ThinkingBlockParam { Thinking thinking.Thinking, Signature thinking.Signature, }); } else if (block.TryPickRedactedThinking(out RedactedThinkingBlock? redacted)) { assistantContent.Add(new RedactedThinkingBlockParam { Data redacted.Data }); } else if (block.TryPickToolUse(out ToolUseBlock? toolUse)) { // ToolUseBlock 有必填 CallerToolUseBlockParam.Caller 可选——不要复制它 assistantContent.Add(new ToolUseBlockParam { ID toolUse.ID, Name toolUse.Name, Input toolUse.Input, }); // 执行工具每个 tool_use 块收集 ONE 个结果——API 拒绝缺 tool_result 的后续请求 string result ExecuteYourTool(toolUse.Name, toolUse.Input); toolResults.Add(new ToolResultBlockParam { ToolUseID toolUse.ID, Content result, }); } } // 后续请求先前消息 assistant 回显 user 的 tool_result ListMessageParam followUpMessages [ .. parameters.Messages, new() { Role Role.Assistant, Content assistantContent }, new() { Role Role.User, Content toolResults }, ];ToolResultBlockParam没有元组构造器——用对象初始化器。Content是 string-or-list 联合普通string会隐式转换。结构化输出OutputConfig new OutputConfig { Format new JsonOutputFormat { Schema new Dictionarystring, JsonElement { [type] JsonSerializer.SerializeToElement(object), [properties] JsonSerializer.SerializeToElement( new { name new { type string } }), [required] JsonSerializer.SerializeToElement(new[] { name }), }, }, },JsonOutputFormat.Type由构造函数自动设为json_schemaSchema为必填。Anthropic 定义的服务器/客户端工具Web search、bash、text editor、code execution 是 Anthropic 定义的带内置 schema 的工具。Web search 与 code execution 由服务器执行bash 与 text editor 由客户端执行你本地处理tool_use。类型名带版本后缀构造函数自动设置name/type。每个都要显式包一层new ToolUnion(...)Tools [ new ToolUnion(new WebSearchTool20260209()), new ToolUnion(new ToolBash20250124()), new ToolUnion(new ToolTextEditor20250728()), new ToolUnion(new CodeExecutionTool20260120()), ],另有new ToolUnion(new WebFetchTool20260209())、new ToolUnion(new MemoryTool20250818())。WebSearchTool20260209可选参数AllowedDomains、BlockedDomains、MaxUses、UserLocation。Tool RunnerBeta——自动执行循环C# SDK 提供BetaToolRunner自动驱动工具执行循环。用原始 JSON schema 定义工具runner 处理API 调用 - 工具执行 - 结果回填的完整循环using Anthropic.Models.Beta.Messages; // 按上文 Tool Use 一节定义工具与 params但使用 beta 命名空间类型BetaToolUnion 等 var runner client.Beta.Messages.ToolRunner(betaParams); await foreach (BetaMessage message in runner) { foreach (var block in message.Content) { if (block.TryPickText(out var text)) { Console.WriteLine(text.Text); } } }二十、流式输出大输出或高max_tokens时默认走流式避免 HTTP 超时。client.Messages.CreateStreaming(parameters)返回可异步枚举的RawMessageStreamEvent序列using Anthropic.Models.Messages; var parameters new MessageCreateParams { Model Model.ClaudeOpus4_8, MaxTokens 64000, Messages [new() { Role Role.User, Content Write a haiku }] }; await foreach (RawMessageStreamEvent streamEvent in client.Messages.CreateStreaming(parameters)) { if (streamEvent.TryPickContentBlockDelta(out var delta) delta.Delta.TryPickText(out var text)) { Console.Write(text.Text); } }RawMessageStreamEvent的 TryPick 方法命名去掉Message/Raw前缀TryPickStart、TryPickDelta、TryPickStop、TryPickContentBlockStart、TryPickContentBlockDelta、TryPickContentBlockStop。没有TryPickMessageStop——用TryPickStop。二十一、Message Batches批量 API非延迟敏感的大规模处理可走批量端点异步运行、成本更低var batch await client.Messages.Batches.Create(new() { Requests [ new() { CustomID req-1, Params new() { Model claude-opus-5, MaxTokens 1024, Messages [...] } }, ], }); // 轮询 client.Messages.Batches.Retrieve(batch.ID) 直到 ProcessingStatus ended // 然后迭代 client.Messages.Batches.Results(batch.ID)。批量结果可能乱序到达——务必以custom_id为键组织结果不要依赖数组位置。完整示例见 csharp/claude-api/batches.md。二十二、Files APIFiles 位于client.Beta.Files命名空间Anthropic.Models.Beta.Files。BinaryContent可从Stream与byte[]隐式转换using Anthropic.Models.Beta.Files; using Anthropic.Models.Beta.Messages; FileMetadata meta await client.Beta.Files.Upload( new FileUploadParams { File File.OpenRead(doc.pdf) }); // 引用上传的文件需要 beta 消息类型 new BetaRequestDocumentBlock { Source new BetaFileDocumentSource { FileID meta.ID }, }非 beta 的DocumentBlockParamSource联合没有 file-ID 变体——文件引用必须走client.Beta.Messages.Create()。注意在较新 SDK 中client.Beta.Files相比旧版有破坏性形状变化已对齐稳定版client.Files迁移细节见 shared/live-sources.md。二十三、Managed AgentsBetaC# SDK 通过client.Beta.Agents、client.Beta.Sessions、client.Beta.Environments及相关命名空间支持 Managed Agents。架构与必选流程Agent 创建一次 - 每次运行创建 Session见 shared/managed-agents-overview.mdwire 级参考见 curl/managed-agents.md。二十四、错误处理要点C# SDK 的异常体系见 shared/error-codes.md400 对应AnthropicBadRequestException、429 对应AnthropicRateLimitException、500 对应Anthropic5xxException、网络错误对应AnthropicIOException基类为AnthropicApiException所有 4xx 异常还继承Anthropic4xxException。按最具体优先的链条捕获把可重试429、500、网络与不可重试4xx区分开不要用一个宽泛 catch-all 吞掉状态信息catch (AnthropicNotFoundException) { ... } // 404 catch (AnthropicRateLimitException) { ... } // 429 退避重试 catch (AnthropicApiException) { ... } // 其余非 2xxSDK 默认max_retries2自动以指数退避重试 408/409/429/5xx 与连接错误。结语这份 C# 指南的实战价值在于先按表定位类型、直接写Program.cs、让编译器告诉你错了什么——而不是反复反射 SDK 或翻文档。配合本仓库的多语言文档体系Python、TypeScript、Go 等与概念层文档工具使用概念、提示缓存设计、模型迁移你可以把 C# 代码示例快速迁移到任意语言并在模型升级、成本优化、Agent 架构设计等场景中保持 API 形状的正确性。核心要点浓缩为一句话beta 与非 beta 命名空间、TryPick*收窄联合、BetaToolRunner托管循环、PascalCase 属性对应 wire 字段——记住这四条大部分 C# 集成问题都能迎刃而解。赞分享人工智能AI 技能AI 评测【免费下载链接】skillsPublic repository for Agent Skills项目地址https://gitcode.com/GitHub_Trending/skills3/skills点击查看免费下载相关推荐基于 Go 语言的 Claude API 开发实战指南anthropic-sdk-go 完整上手与高级特性基于 Go 语言的 Claude API 开发实战指南anthropic sdk go 完整上手与高级特性 本指南以 .agents/skills/claud人工智能大模型AI 应用移动开发交互助手RikkaHub 集成 Claude Messages API 实战指南基于 Anthropic Python SDK 的调用、缓存与错误处理全解析RikkaHub 集成 Claude Messages API 实战指南基于 Anthropic Python SDK 的调用、缓存与错误处理全解析 本指南以人工智能大模型AI 应用移动开发交互助手RikkaHub 与 Claude API Tool Use基于 Ruby SDK 的工具调用实战指南RikkaHub 与 Claude API Tool Use基于 Ruby SDK 的工具调用实战指南 RikkaHub 是一个支持多家 LLM Provid人工智能大模型AI 应用移动开发交互助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进