
LiteLLM Terraform Provider 数据源实战用 litellm_organizations 读取组织、预算与配额【免费下载链接】litellmThe fastest, litest AI Gateway. Rust core with Python SDK. Call 100 LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]项目地址: https://gitcode.com/GitHub_Trending/li/litellmlitellm_organizations 是 terraform-provider-litellm 提供的一个只读数据源Data Source用于调用 LiteLLM Proxy 的GET /organization/list管理端点把当前 LiteLLM 实例中的组织Organization及其关联预算、TPM/RPM 配额批量拉取到 Terraform 状态中。读完本文你将掌握该数据源的声明语法、全部入参与导出属性理解它在源码与 Proxy 侧的实际调用链路并学会结合litellm_organization、litellm_team等资源做组织级基础设施编排。前置条件Provider 与认证配置litellm_organizations数据源隶属于 terraform-provider-litellmProvider 源码位于 terraform/provider。在使用任何数据源之前需要先在 Terraform 配置中声明并认证该 Provider。完整的 Provider 级示例可参考 docs/index.md。terraform { required_providers { litellm { source registry.terraform.io/BerriAI/litellm } } } provider litellm { api_base https://your-litellm-proxy.com api_key var.litellm_api_key }Provider 级配置项支持两个必填参数也可以通过同名环境变量注入参数必需说明环境变量api_base是LiteLLM Proxy 实例的基础 URLLITELLM_API_BASEapi_key是用于访问 LiteLLM Proxy 的 API KeyLITELLM_API_KEYinsecure_skip_verify否跳过 TLS 证书校验仅开发或自签名证书场景默认falseLITELLM_INSECURE_SKIP_VERIFY例如只使用环境变量时可以直接写空 Provider 块provider litellm {}这三个配置项的 Go 实现定义在 provider.go其中insecure_skip_verify属于可选配置其余两个是 Required。litellm_organizations 数据源概览litellm_organizations的核心职责是列出而不是读取单个LiteLLM 组织。按照 organizations.md 的说明它对应 Proxy 端的/organization/list接口。它与单数形式的数据源litellm_organization恰好互补litellm_organizations复数本文主题→ 调用GET /organization/list批量列出可选org_alias过滤导出ids与organizations列表litellm_organization单数→ 调用GET /organization/info按organization_id精确定位单个组织额外导出metadata、soft_budget、max_parallel_requests等更细的预算字段详见 organization.md。示例用法将组织列表导出为输出这是文档给出的最直接用例实例化一个不带参数的数据源取出所有组织 ID并暴露为 Terraform 输出。data litellm_organizations all {} output organization_ids { value data.litellm_organizations.all.ids }在仅列出组织这一场景下数据源无需任何必填参数即可工作其唯一的可配置参数org_alias是可选的。terraform apply/terraform refresh执行后data.litellm_organizations.all.ids将是一个字符串列表。通过 org_alias 过滤当需要把查询范围收窄到某个别名命中的组织时可以传入org_aliasdata litellm_organizations acme { org_alias acme } output acme_org_ids { value data.litellm_organizations.acme.ids }这里有一点需要特别留意从 Proxy 源码看org_alias走的是Prismacontainsmode: insensitive的模糊匹配大小写不敏感的部分匹配而不是精确相等匹配因此一次查询可能返回多个组织。详见下文「Proxy 侧的真实行为」。Argument Reference唯一的入参根据 organizations.md 的 Argument Reference该数据源仅支持一个参数org_alias-可选按组织别名alias过滤要列出的组织。在 data_source_organization.go 的 Schema 定义中org_alias类型为schema.TypeStringOptional: true。其余字段全部是Computed: true只读由 API 响应反填。Attributes Reference全部导出属性除入参org_alias本身外数据源导出以下属性。其中顶层ids与organizations是本数据源最常用的两个结果属性类型说明idslist(string)返回的组织 ID 列表organizationslist(object)组织对象列表每个元素导出以下字段organizations列表中每个条目的字段属性类型说明organization_idstring组织的唯一标识符organization_aliasstring组织用户友好的名称budget_idstring所挂载预算budget的 IDmodelslist(string)该组织可访问的模型列表spendfloat该组织累计的消费金额max_budgetfloat挂载预算中的最大预算上限tpm_limitint挂载预算中的每分钟 Token 数TPM上限rpm_limitint挂载预算中的每分钟请求数RPM上限budget_durationstring挂载预算的预算重置周期如30d、7dcreated_atstring创建时间戳updated_atstring最后更新时间戳一个完整引用这些字段的配置示例data litellm_organizations all {} output org_summaries { value [ for org in data.litellm_organizations.all.organizations : { id org.organization_id alias org.organization_alias models org.models budget_id org.budget_id max_budget org.max_budget tpm_limit org.tpm_limit rpm_limit org.rpm_limit budget_duration org.budget_duration spend org.spend } ] }需要提醒的是organizations列表中导出的字段是该数据源 Schema 的子集与单数数据源litellm_organization相比不含metadata、soft_budget、max_parallel_requests等字段。如果需要某个组织的完整元数据与预算详情应改为使用单数数据源见后文「与单数数据源和资源的协同」。源码实现从 HCL 到 API 调用的完整链路要深入理解该数据源最有价值的是阅读它的 Go 实现 data_source_organization.go。复数与单数两个数据源同处一个文件复数数据源的入口定义在 L166-L203读取逻辑在dataSourceLiteLLMOrganizationsReadL205-L256。端点与查询参数拼接源码第 12 行定义了列表端点常量const endpointOrganizationList /organization/list读取函数中org_alias是否传入会决定请求形式L208-L211endpoint : endpointOrganizationList if v, ok : d.GetOk(org_alias); ok { endpoint fmt.Sprintf(%s?org_alias%s, endpointOrganizationList, url.QueryEscape(v.(string))) }也就是说未提供org_alias→ 请求GET {api_base}/organization/list提供了org_alias→ 请求GET {api_base}/organization/list?org_aliasURL编码后的值。随后通过MakeRequest(client, GET, endpoint, nil)发起带认证的 HTTP GEThandleResponse统一处理非 2xx 响应响应体被解码为[]organizationDetail切片。响应结构体与内嵌预算表organizationDetail结构体L23-L33刻画了 Proxy 返回的每个组织对象的 JSON 形态type organizationDetail struct { OrganizationID string json:organization_id OrganizationAlias string json:organization_alias BudgetID string json:budget_id Models []string json:models Spend float64 json:spend Metadata map[string]interface{} json:metadata CreatedAt string json:created_at UpdatedAt string json:updated_at Budget *organizationBudget json:litellm_budget_table }关键点预算相关信息并不平铺在组织对象顶层而是内嵌在litellm_budget_table子对象中。organizationBudget结构体L14-L21对应如下 JSON 字段type organizationBudget struct { MaxBudget *float64 json:max_budget SoftBudget *float64 json:soft_budget TPMLimit *int json:tpm_limit RPMLimit *int json:rpm_limit MaxParallelRequests *int json:max_parallel_requests BudgetDuration string json:budget_duration }组装 Terraform 状态读取响应后代码遍历每个组织L228-L248把所有OrganizationID追加进顶层ids列表为每个组织构造一个map[string]interface{}条目先填充organization_id、organization_alias、budget_id、models、spend、created_at、updated_at当且仅当org.Budget ! nil时才写入max_budget、tpm_limit、rpm_limit、budget_duration其中max_budget/tpm_limit/rpm_limit通过解引用辅助函数处理 Go 指针nil统一归零。这一点解释了 Attribute Reference 里的一个细节spend、created_at、updated_at属于组织自身属性一定存在而max_budget、tpm_limit、rpm_limit、budget_duration来自挂载的预算表。如果某个组织没有挂预算无litellm_budget_table这些字段会被写为0/ 空字符串——在测试用例中可以看到未挂预算的组织max_budget解析为0.0。ID 语义数据源读操作的最后设置了资源 IDL250d.SetId(GetStringValue(d.Get(org_alias).(string), all))即如果传了org_aliasTerraform 内部 ID 就是该别名否则固定为all。它是状态管理用的内部键不是 API 中的真实组织 ID——真实 ID 请读取ids/organizations[*].organization_id。Proxy 侧的真实行为过滤与权限边界数据源背后的 Proxy 端接口实现在 organization_endpoints.py即GET /organization/list路由由user_api_key_auth保护。阅读该实现可以确认三条重要行为1.org_alias是大小写不敏感的部分匹配。服务端把它翻译成 Prisma 的模糊条件where_conditions[organization_alias] { contains: org_alias, mode: insensitive, # Case-insensitive search }这意味着查询acme也会命中acme-eu、Acme Prod之类的别名结果可能是多个组织。这与 Terraform 文档中「Filter organizations by alias」的措辞完全一致但也说明它不适合做「精确取一个组织」——那样应该用单数数据源按organization_id精确查询。2. 权限决定返回范围。服务端根据调用者角色分流Proxy 管理员_user_has_admin_view→ 返回全部组织叠加可选过滤普通内部用户 → 只会返回其作为成员的组织通过OrganizationMembershipRepository查用户 ID 对应成员关系再求交集。因此从 Terraform Provider 读取时返回的组织数量由所用 API Key 的权限决定。如果发现列出的组织比预期少优先检查该 Key 的管理员角色。3. 预算通过关联子表返回。服务端使用find_many(include{litellm_budget_table: True, members: True, teams: True})预加载关联数据litellm_budget_table即前面 Go 结构体中内嵌预算的 JSON 来源。该端点的响应类型在 proxy/_types.py 中定义为LiteLLM_OrganizationTableWithMembers。Proxy 端列表接口还额外支持org_id查询参数精确匹配不过当前 Terraform 数据源只暴露了org_alias一个过滤入口未暴露org_id。如果需要按 ID 精确获取请使用单数数据源。与单数数据源和资源的协同使用实际 IaC 工程中litellm_organizations通常与 Provider 中其他组织/团队相关能力搭配出现先列出、再钻取用复数数据源拿到 ID 列表后可通过for_each迭代单数数据源litellm_organization获取每个组织的完整预算明细组织下挂载团队litellm_team资源支持organization_id属性可以直接引用数据源导出的 ID将团队归入组织此用法同样出现在单数数据源 organization.md 的示例中组织本身由资源管理Provider 还提供litellm_organization资源以及组织成员资源litellm_organization_member等全部注册于 provider.go。组织资源的删除逻辑会级联清理成员、Key 等定义在 resource_organization.go。一个典型的「组织 团队」编排示例混合资源与数据源# 找到目标组织 data litellm_organizations target { org_alias data-platform } # 在可能是多个命中的组织下创建团队 resource litellm_team ml { team_alias ml-team organization_id data.litellm_organizations.target.organizations[0].organization_id }由于org_alias为模糊匹配实际使用时建议配合count/for_each对多组织结果做显式选择避免索引越界。测试验证数据源行为如何被保障Provider 为组织数据源提供了基于httptest的单元测试见 data_source_organization_test.go。其中TestDataSourceOrganizationsReadL76-L120完整模拟了复数数据源的核心契约断言请求方法为GET且路径精确等于/organization/list断言传入的org_aliasacme被正确带到查询参数构造包含两个组织的模拟 JSON 响应第一个带litellm_budget_table第二个不带随后校验数据源内部 ID 等于传入别名acmeids依次为[org-1, org-2]第一个组织的max_budget 100.0、budget_duration 7d第二个组织因无预算表max_budget被归一为0.0。这份测试印证了上文关于「无预算组织字段归零」的实现推断也是理解响应结构时最直观的样例数据。常见问题排查要点列出的组织比预期少先核对 API Key 是否为 Proxy 管理员普通用户只会看到自己加入的组织organization_endpoints.py。org_alias过滤命中多个组织别名是大小写不敏感的contains模糊匹配需在 HCL 侧处理多结果。预算字段为 0 或空字符串该组织没有挂载litellm_budget_table预算表需要预算治理请先通过litellm_budget/ 组织管理端点为其绑定预算。需要单个组织的metadata等详细字段复数数据源未导出这些字段改用litellm_organization数据源按organization_id查询。读数据时提示无数据库连接/organization/list依赖 Prisma 数据库prisma_client请确保 Proxy 已正确连接数据库后运行terraform refresh。小结litellm_organizations是 terraform-provider-litellm 中面向组织维度的只读入口它把 LiteLLM Proxy 的GET /organization/list封装为一个声明式的 HCL 数据源输出组织 ID 全集以及带预算配额的组织明细。搭配org_alias过滤、单数数据源litellm_organization和litellm_team等资源可以完整实现「组织即代码」的治理拓扑。透过 data_source_organization.go 与 organization_endpoints.py 的对照阅读你可以清楚看到 HCL Schema、Go 结构体、HTTP 端点与 Proxy 数据库查询四层之间的映射关系进而在真实的 Terraform 工程中准确预测该数据源每一次 refresh 的行为。【免费下载链接】litellmThe fastest, litest AI Gateway. Rust core with Python SDK. Call 100 LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]项目地址: https://gitcode.com/GitHub_Trending/li/litellm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考