1774673562
This commit is contained in:
@@ -1,40 +0,0 @@
|
||||
# 常用 Screen 命令大全
|
||||
|
||||
## 创建会话(最常用)
|
||||
|
||||
- `screen -U -S vllm_server` → 新建并命名
|
||||
- `screen -U -dmS vllm_server` → **新建后立即分离**(最推荐!直接后台启动)
|
||||
- `screen -U -dmS vllm_server "python -m vllm serve …"` → 新建 + 直接执行命令(一键启动服务)
|
||||
|
||||
## 管理会话
|
||||
|
||||
- `screen -U -ls` 或 `screen -U -list` → 列出所有会话(你现在用的)
|
||||
- `screen -U -r` → 进入最后一个会话
|
||||
- `screen -U -r vllm_server` → 按名字进入(推荐,比数字更稳)
|
||||
- `screen -U -r 89505` → 只输入数字也可以(简写)
|
||||
- `screen -U -S vllm_server -X quit` → 杀死指定会话(你现在用的)
|
||||
- `screen -wipe` → 清理已死亡的会话记录(偶尔用)
|
||||
|
||||
# 在 screen 里面的快捷键(记住这几个就够用 90%)
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
|--------|------|
|
||||
| `Ctrl-a ?` | 显示帮助(所有快捷键列表) |
|
||||
| `Ctrl-a c` | 新建一个窗口(像 tab) |
|
||||
| `Ctrl-a n` / `Ctrl-a p` | 切换到下一个/上一个窗口 |
|
||||
| `Ctrl-a 0~9` | 直接跳到第几个窗口 |
|
||||
| `Ctrl-a d` | 分离(退出) |
|
||||
| `Ctrl-a k` | 杀死当前窗口(确认 y) |
|
||||
| `Ctrl-a A` | 重命名当前窗口(好认) |
|
||||
| `Ctrl-a "` | 显示窗口列表,选择切换 |
|
||||
|
||||
# 高级实用技巧
|
||||
|
||||
- 滚动屏幕:`Ctrl-a [` → 进入复制模式,用上下键翻历史,按 `Esc` 退出
|
||||
- 发送命令给后台会话:`screen -S vllm_server -X stuff "echo hello\n"`
|
||||
- 自动启动 vLLM(推荐写进脚本):
|
||||
|
||||
```bash
|
||||
screen -U -dmS vllm_server
|
||||
screen -S vllm_server -X stuff "python -m vllm serve --model /root/autodl-tmp/DeepSeek-R1-1.5B --port 8000\n"
|
||||
```
|
||||
@@ -1,53 +0,0 @@
|
||||
`x-csrf-token` 是 Spring Security CSRF 防护机制 的一部分,用于防止跨站请求伪造(CSRF)攻击。
|
||||
|
||||
后端接口需要通过请求头接收前端携带的 CSRF token,以验证请求的合法性。
|
||||
|
||||
其中 IBSCsrfTokenRepository 管理 CSRF token,是一个 `UUID.randomUUID().toString()` 随机字符串
|
||||
|
||||
登录成功后,SecurityConfig.writeLoginSuccessResult()(SecurityConfig.java:482)会将 token 存入 session:request.getSession().setAttribute(IBSCsrfTokenRepository.class.getName() + ".CSRF_TOKEN", token)
|
||||
|
||||
同时通过 /admin/getCurrentUser 接口返回给前端:userVO.setCsrfToken(csrfToken.getToken())
|
||||
|
||||
```
|
||||
前端获取 Token
|
||||
前端有两套机制,取决于环境:
|
||||
|
||||
生产环境(cdn-web 模板):页面通过 Thymeleaf 模板将 token 渲染到 HTML meta 标签中
|
||||
|
||||
|
||||
<meta name="_csrf" th:content="${_csrf.token}">
|
||||
<meta name="_csrf_header" th:content="${_csrf.headerName}">
|
||||
前端通过 getCsrfHeaderFromMeta() 读取这两个 meta 标签,动态设置请求头。
|
||||
|
||||
非生产环境(IBS-web):通过调用 /admin/getCurrentUser 接口获取 token 并缓存在 window.XTOKEN 中。
|
||||
```
|
||||
|
||||
后端 Filter 链验证 Token
|
||||
|
||||
RequestReplaceFilter
|
||||
|
||||
```
|
||||
response.setHeader("Access-Control-Allow-Headers",
|
||||
"content-type,x-requested-with,Authorization, x-request-with,x-ui-request,lang,x-csrf-token,csrf-token");
|
||||
|
||||
```
|
||||
|
||||
```
|
||||
在 SecurityConfig.csrf() 配置中(SecurityConfig.java:211-218),以下路径不进行 CSRF 校验:
|
||||
|
||||
// CSRF
|
||||
String[] ignorePathes = {"/v1/**", "/v2/**", "/v1.0/**", "/analyzer/**", "/puppet/**", "/api/**",
|
||||
"/sso/**", "/ssoapi/**", "/dss/prohibit/**", "/dss/v1/log/subscribe/callback", "/portal/**",
|
||||
"/param/config/**", "/bboss/**", "/sync/BBOSS/**", "/download/exportFile", "/action", "/actionpm",
|
||||
"/action/cms", "/action/cdn/statistics", "/action/enterprise/domains","/action/enterprise/productId/domains",
|
||||
"/action/js", "/content/delivery/**", "/information/**","/testAction","/api/v2/**",
|
||||
"/home/page/help/Doc/**", "/home/page/security/**", "/query/cmcc/party/**", "/query/enterprise/domain/info", "/v2.0/log/template/**"};
|
||||
http.csrf().ignoringAntMatchers(ignorePathes)
|
||||
.csrfTokenRepository(new IBSCsrfTokenRepository(Arrays.asList(ignorePathes)));//不塞在cookie中
|
||||
```
|
||||
|
||||
如果请求路径在 ignorePathes 列表中(如 /v1/**, /api/**, /action, /actionpm 等),loadToken 返回硬编码的 "1111111111",此时:
|
||||
|
||||
请求带 X-CSRF-TOKEN: 1111111111 → 可以通过
|
||||
|
||||
请求带 X-CSRF-TOKEN: 任意UUID → 失败
|
||||
@@ -1,139 +0,0 @@
|
||||
```
|
||||
{
|
||||
"model": "deepseek-chat",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": "北京现在的天气怎么样?"
|
||||
}
|
||||
],
|
||||
"tools": [
|
||||
{
|
||||
"type": "function",
|
||||
"function": {
|
||||
"name": "get_weather",
|
||||
"description": "获取指定城市的天气信息",
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"city": {
|
||||
"type": "string",
|
||||
"description": "城市名称"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"city"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"tool_choice": "auto"
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
"id": "06bcc2b7-602a-474b-bdd3-01cea249b121",
|
||||
"object": "chat.completion",
|
||||
"created": 1774519072,
|
||||
"model": "deepseek-chat",
|
||||
"choices": [
|
||||
{
|
||||
"index": 0,
|
||||
"message": {
|
||||
"role": "assistant",
|
||||
"content": "我来帮您查询北京的天气情况。",
|
||||
"tool_calls": [
|
||||
{
|
||||
"index": 0,
|
||||
"id": "call_00_s4Qs5fJiG0yeRTpOgYxnxRyp",
|
||||
"type": "function",
|
||||
"function": {
|
||||
"name": "get_weather",
|
||||
"arguments": "{\"city\": \"北京\"}"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"logprobs": null,
|
||||
"finish_reason": "tool_calls"
|
||||
}
|
||||
],
|
||||
"usage": {
|
||||
"prompt_tokens": 309,
|
||||
"completion_tokens": 51,
|
||||
"total_tokens": 360,
|
||||
"prompt_tokens_details": {
|
||||
"cached_tokens": 0
|
||||
},
|
||||
"prompt_cache_hit_tokens": 0,
|
||||
"prompt_cache_miss_tokens": 309
|
||||
},
|
||||
"system_fingerprint": "fp_eaab8d114b_prod0820_fp8_kvcache_new_kvcache"
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
{
|
||||
"model": "deepseek-chat",
|
||||
"messages": [
|
||||
{
|
||||
"role": "user",
|
||||
"content": "给我返回一个水果的信息,包含名称和颜色"
|
||||
}
|
||||
],
|
||||
"response_format": {
|
||||
"type": "json_schema",
|
||||
"json_schema": {
|
||||
"name": "fruit",
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"name": {
|
||||
"type": "string",
|
||||
"description": "水果名称"
|
||||
},
|
||||
"color": {
|
||||
"type": "string",
|
||||
"description": "水果颜色"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"name",
|
||||
"color"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
{
|
||||
"id": "chatcmpl-2b2225c5-02d0-4817-8039-329b3c790128",
|
||||
"object": "chat.completion",
|
||||
"created": 1774519551,
|
||||
"model": "gpt-5.4",
|
||||
"choices": [
|
||||
{
|
||||
"index": 0,
|
||||
"message": {
|
||||
"role": "assistant",
|
||||
"content": "{\"color\":\"红色\",\"name\":\"苹果\"}"
|
||||
},
|
||||
"finish_reason": "stop"
|
||||
}
|
||||
],
|
||||
"usage": {
|
||||
"prompt_tokens": 80,
|
||||
"completion_tokens": 17,
|
||||
"total_tokens": 97,
|
||||
"prompt_tokens_details": {},
|
||||
"completion_tokens_details": {
|
||||
"reasoning_tokens": 0,
|
||||
"accepted_prediction_tokens": 0,
|
||||
"rejected_prediction_tokens": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -22,3 +22,23 @@ com.cmcc.cdn.platform.selfservice.controller.StatisticsController#getHitRatio
|
||||
给我梳理下这个接口的功能,输出一个 markdown 文档到项目的根目录。
|
||||
|
||||
主要是用到哪些参数,有哪些校验,有没有参数转换和默认值。掉了哪些三方接口,调了接口后做了哪些事情。尽量清晰。注意细节。
|
||||
|
||||
---
|
||||
|
||||
com.cmcc.cdn.platform.selfservice.controller.StatisticsController#getHitRatio
|
||||
|
||||
getHitRatio接口分析.md 是我 getHitRatio 命中率接口的梳理,是在跑的业务。我现在给你安排一个艰巨的任务。
|
||||
|
||||
因为我们有一个 MCP 注册中心。我要接入进去。接入我们只需要提供标准的 http 接口就行了。所以按照这个接口做 3 个新接口出来:
|
||||
|
||||
1. 请求数
|
||||
2. 命中请求数
|
||||
3. 计算命中率(命中率 = 命中请求数 / 总请求数)的接口。
|
||||
|
||||
controller 在 ibs-portal\cdn-web\src\main\java\com\cmcc\cdn\platform 下建一个 mcp 文件夹写。
|
||||
|
||||
service 在 ibs-portal\cdn-service\src\main\java\com\cmcc\cdn\platform 下建一个 mcp 文件夹写。
|
||||
|
||||
因为是新接口代码一定要标准易读清晰,不要用原来的垃圾逻辑。
|
||||
|
||||
再帮我额外提供一个接口。可以实现比如 AI 获取 请求数 然后获取 命中请求数 。然后可以计算他们两个得出命中率的工具接口。方便我测试是调用一次计算命中率比较好,还是调用 请求数 然后调用 命中请求数 然后调用计算工具计算合适。
|
||||
|
||||
Reference in New Issue
Block a user