> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tuneplane.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 在团队中工作

> 你团队的配额从哪来、借用是什么意思，以及怎么让一次运行过掉预算。

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  https://tuneplane.your-company.com/api/teams/mine
```

列出你所属的团队。控制台在[审批](/zh-Hans/console/approvals)下显示同样的信息，管理员还能在
[团队](/zh-Hans/console/teams)页上看到。

团队是商业版功能。社区版部署里所有人在一个团队里，这一页上的东西都不会触发。

## 一次运行的团队来自它的项目

不是来自你。一次运行的团队取自它的**项目**，并在提交时盖在作业行上。

两半都很关键。一个人可以属于多个团队，所以按团队成员求和会把一次运行算到所有团队头上。而一个项目
在部门之间挪动，不能改写上个季度的用量，这正是团队被冻结在那一行上、而不是读取时再 join 的原因。

所以要改一次运行算在哪个团队头上，就是挪那个项目：

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X PUT https://tuneplane.your-company.com/api/teams/project \
  -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  -d '{"project": "support-agent", "team": "ml-platform"}'
```

## 两份配额，而且读法不同

你自己的配额和你团队的配额都会被检查。团队那一侧有两条语义和按用户的那套正好相反，值得知道是哪两条：

|     | 按用户的配额   | 团队配额                            |
| --- | -------- | ------------------------------- |
| 没配置 | 视为上限为零   | 视为**没有上限**。创建一个团队不能成为封死里面每个人的手段 |
| 管理员 | 在某些检查里豁免 | **不豁免。** 跳过一个团队的预算是在花另一个部门的钱    |

超出团队配额时，作业带一个 `teamQuota` 原因在 `QUEUED` 里等，和个人配额完全一样。信息里会点名那个
团队。

## 借用，以及什么能被要回去

开了抢占并有许可证时，团队配额不再是一个上限，而变成一个**保障额度**。集群空闲时你的团队可以跑到
它之上，而超出的那部分是可被回收的。

在你一个正在跑的作业被回收之前，五个条件必须全部成立：

* 索取方的团队**低于**自己的保障额度。否则这只是一个团队在竞价压过另一个。
* 你的团队**高于**自己的保障额度。否则回收会打破配额唯一的那个承诺。
* 是不同的团队。
* 你的作业已经跑过一个最短运行时间。否则一个繁忙的队列会整天地回收、准入、再回收，而集群把时间
  花在写 checkpoint 上。
* 你的作业持有的正是紧缺的那个卡型。

回收先拿**最年轻**的作业，有意不是优先级最低的 —— 优先级排的是谁下一个跑，那是用同一个数字回答的
另一个问题。

被回收的作业会被暂停、checkpoint 保留，然后回到 `QUEUED`。见
[作业状态](/zh-Hans/concepts/job-lifecycle)。

## 让一次运行过掉预算

你团队花完这个月的预算时，一个排队中的作业会这么说。为那一次运行申请一个例外：

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X POST https://tuneplane.your-company.com/api/approvals/budget-exception \
  -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  -d '{"run_id": "run-4f2a91", "reason": "周四的客户演示"}'
```

一次批准让**一次运行**过**一道 gate**，一次。不是这个团队、不是这个月、也不是直到有人撤销：一个
比它被给出的理由活得更久的批准，会让预算不再是预算。

升级是主动申请的，这也是为什么它是你发起的请求、而不是每次拒绝都自动触发的东西。团队配额通常在几
分钟内随同事的作业结束而腾出来，所以把每次拒绝都送到人那里，会产出一队自己就会有答案的请求，和一个
不再看这个列表的审批人。

## 申请更多配额

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -X POST https://tuneplane.your-company.com/api/approvals/quota-change \
  -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  -d '{
    "subject": "alice", "subject_type": "user",
    "max_concurrent_gpus": 16, "daily_gpu_hours": 200,
    "reason": "Q4 评测扫描"
  }'
```

`subject_type` 是 `user` 或 `team`。你没写的字段不会被改动。

只有一级审批，没有链式。联签属于你们组织已经在用的那套审批系统；这个平台对它欠的是一条记录和一个
webhook。

## 跟踪一个请求

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  "https://tuneplane.your-company.com/api/approvals?status=pending"
```

`status` 是 `pending`、`approved`、`rejected` 或 `expired`。每个请求都带一个有效期，所以没人回答的
请求不会永远敞着。

## 确认成功

```bash theme={"theme":{"light":"github-light","dark":"github-dark-dimmed"}}
curl -H "Authorization: Bearer $TUNEPLANE_CLIENT_TOKEN" \
  https://tuneplane.your-company.com/api/teams/ml-platform/usage
```

显示你团队这一周期的小时数。一次批准之后，被卡住的那个作业会在调度器下一轮里自己离开 `QUEUED`，
不用你重新提交。

决定会在任何东西被应用**之前**就把请求推到它的终态，所以两个审批人同时点，产生一个效果。

## 下一步

[审批页](/zh-Hans/console/approvals) · [资源与配额](/zh-Hans/concepts/resources) ·
如果配置的人是你，见[配置团队与配额](/zh-Hans/ops/teams)
