文档
AI 服务 API
SmartCV AI 服务 API 文档,包含 ATS 分析、智能优化、主题推荐等 AI 功能
更新时间: 2024/12/30
SmartCV AI 服务提供强大的人工智能功能,包括 ATS 兼容性分析、智能简历优化、主题推荐等。
📋 API 端点概览
端点 | 方法 | 描述 |
---|---|---|
/api/ai/analyze | POST | ATS 兼容性分析 |
/api/ai/generate | POST | AI 内容生成 |
/api/ai/theme-recommendation | POST | 主题推荐 |
🔍 ATS 兼容性分析
端点: POST /api/ai/analyze
描述: 分析简历与职位描述的匹配度,提供 ATS 兼容性评分和优化建议
认证: 需要登录
请求体:
{
"resumeData": {
"personalInfo": {
"name": "张三",
"email": "[email protected]",
"phone": "13800138000",
"summary": "5年前端开发经验,熟练掌握React、Vue等框架..."
},
"workExperience": [
{
"company": "ABC科技公司",
"position": "前端工程师",
"startDate": "2021-01",
"endDate": "2024-12",
"description": "负责公司主要产品的前端开发,使用React技术栈..."
}
],
"education": [
{
"school": "北京大学",
"degree": "计算机科学与技术",
"startDate": "2017-09",
"endDate": "2021-06"
}
],
"skills": ["React", "Vue", "JavaScript", "TypeScript", "Node.js"]
},
"jobDescription": "我们正在寻找一位经验丰富的前端工程师,要求熟练掌握React、Vue、JavaScript等技术...",
"resumeId": "resume_123"
}
响应:
{
"success": true,
"analysis": {
"overallScore": 85,
"keywordMatchScore": 78,
"formatScore": 92,
"contentScore": 88,
"sections": {
"personalInfo": {
"score": 95,
"issues": [],
"suggestions": []
},
"workExperience": {
"score": 85,
"issues": ["工作描述中缺少具体的技术成果"],
"suggestions": ["添加具体的项目成果和数据指标", "使用更多与职位相关的关键词"]
},
"skills": {
"score": 90,
"issues": [],
"suggestions": ["可以添加更多与职位相关的技能"]
}
},
"extractedKeywords": ["React", "Vue", "JavaScript", "前端", "开发"],
"matchedKeywords": ["React", "Vue", "JavaScript"],
"missingKeywords": ["TypeScript", "Webpack", "Git"],
"keywordDensity": {
"React": 0.15,
"Vue": 0.1,
"JavaScript": 0.12
},
"suggestions": [
{
"type": "keyword",
"priority": "high",
"message": "建议在工作经历中添加 'TypeScript' 关键词",
"section": "workExperience"
},
{
"type": "content",
"priority": "medium",
"message": "工作描述可以更具体,添加项目成果和数据",
"section": "workExperience"
},
{
"type": "format",
"priority": "low",
"message": "建议使用更标准的日期格式",
"section": "workExperience"
}
],
"compatibilityInsights": {
"atsReadability": "excellent",
"formatCompatibility": "good",
"keywordOptimization": "needs_improvement"
}
}
}
🤖 AI 内容生成
端点: POST /api/ai/generate
描述: 使用 AI 生成或优化简历内容
认证: 需要登录
请求体:
{
"type": "work_experience",
"context": {
"position": "前端工程师",
"company": "ABC科技公司",
"duration": "3年",
"technologies": ["React", "Vue", "JavaScript"],
"achievements": ["提升页面性能", "开发组件库"]
},
"jobDescription": "负责前端开发工作,要求有React经验...",
"tone": "professional",
"language": "zh-cn"
}
支持的内容类型:
personal_summary
: 个人简介work_experience
: 工作经历描述project_description
: 项目描述skills_summary
: 技能总结cover_letter
: 求职信
响应:
{
"success": true,
"data": {
"generatedContent": "在ABC科技公司担任前端工程师期间,我负责公司核心产品的前端开发工作。熟练运用React、Vue等现代前端框架,成功开发了多个高性能的用户界面。通过优化代码结构和实施最佳实践,将页面加载速度提升了40%。同时主导开发了公司的组件库系统,提高了团队开发效率30%,为公司节省了大量开发成本。",
"keywordIntegration": {
"integrated": ["React", "Vue", "前端开发", "性能优化"],
"density": 0.08,
"naturalness": "high"
},
"alternatives": [
{
"version": "简洁版",
"content": "负责ABC科技公司前端开发,使用React、Vue构建用户界面,优化性能提升40%,开发组件库提高团队效率30%。"
},
{
"version": "详细版",
"content": "作为ABC科技公司的资深前端工程师,我在3年的工作期间专注于用户体验和技术创新..."
}
],
"metrics": {
"readabilityScore": 88,
"professionalTone": 92,
"keywordRelevance": 85
}
}
}
🎨 主题推荐
端点: POST /api/ai/theme-recommendation
描述: 基于简历内容和目标职位推荐最适合的模板主题
认证: 需要登录
请求体:
{
"resumeData": {
/* 简历数据 */
},
"targetRole": "前端工程师",
"industry": "科技",
"experience": "mid-level",
"preferences": {
"style": "modern",
"colorPreference": "blue",
"layout": "single-column"
}
}
响应:
{
"success": true,
"data": {
"recommendations": [
{
"templateId": "template_123",
"templateName": "现代科技",
"confidence": 0.92,
"reasoning": "该模板的现代设计风格和技术感非常适合前端工程师职位",
"pros": ["简洁现代的设计风格", "突出技术技能展示", "良好的 ATS 兼容性"],
"cons": ["对于传统行业可能过于现代"],
"customizations": {
"primaryColor": "#2563eb",
"fontFamily": "Inter",
"layout": "two-column"
}
},
{
"templateId": "template_456",
"templateName": "专业简约",
"confidence": 0.85,
"reasoning": "专业的布局适合有经验的开发者,突出工作成果",
"pros": ["专业的视觉呈现", "适合中高级职位", "良好的内容组织"],
"cons": ["设计相对保守"]
}
],
"styleAnalysis": {
"recommendedStyle": "modern-professional",
"colorScheme": "tech-blue",
"layoutPreference": "two-column",
"fontRecommendation": "sans-serif"
},
"industryInsights": {
"popularStyles": ["modern", "minimal"],
"colorTrends": ["blue", "gray", "green"],
"layoutPreferences": ["two-column", "single-column"]
}
}
}
📝 使用示例
JavaScript 示例
// ATS 分析
async function analyzeResume(resumeData, jobDescription, resumeId) {
const response = await fetch('/api/ai/analyze', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
resumeData,
jobDescription,
resumeId
})
})
const data = await response.json()
if (data.success) {
return data.analysis
} else {
throw new Error(data.error)
}
}
// AI 内容生成
async function generateContent(type, context, jobDescription) {
const response = await fetch('/api/ai/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
type,
context,
jobDescription,
tone: 'professional',
language: 'zh-cn'
})
})
const data = await response.json()
if (data.success) {
return data.data
} else {
throw new Error(data.error)
}
}
// 主题推荐
async function getThemeRecommendations(resumeData, targetRole, industry) {
const response = await fetch('/api/ai/theme-recommendation', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
resumeData,
targetRole,
industry,
experience: 'mid-level'
})
})
const data = await response.json()
if (data.success) {
return data.data
} else {
throw new Error(data.error)
}
}
React Hook 示例
import { useState } from 'react'
function useAIAnalysis() {
const [analysis, setAnalysis] = useState(null)
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
const analyzeResume = async (resumeData, jobDescription, resumeId) => {
try {
setLoading(true)
setError(null)
const response = await fetch('/api/ai/analyze', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
resumeData,
jobDescription,
resumeId
})
})
const data = await response.json()
if (data.success) {
setAnalysis(data.analysis)
return data.analysis
} else {
throw new Error(data.error)
}
} catch (err) {
setError(err.message)
throw err
} finally {
setLoading(false)
}
}
return {
analysis,
loading,
error,
analyzeResume
}
}
// AI 分析结果组件
function AIAnalysisResults({ analysis }) {
if (!analysis) return null
return (
<div className="ai-analysis-results">
<div className="overall-score">
<h3>总体评分</h3>
<div className="score-circle">
<span className="score">{analysis.overallScore}</span>
<span className="total">/100</span>
</div>
</div>
<div className="score-breakdown">
<h4>评分详情</h4>
<div className="score-item">
<span>关键词匹配</span>
<span>{analysis.keywordMatchScore}/100</span>
</div>
<div className="score-item">
<span>格式规范</span>
<span>{analysis.formatScore}/100</span>
</div>
<div className="score-item">
<span>内容质量</span>
<span>{analysis.contentScore}/100</span>
</div>
</div>
<div className="suggestions">
<h4>优化建议</h4>
{analysis.suggestions.map((suggestion, index) => (
<div key={index} className={`suggestion ${suggestion.priority}`}>
<span className="priority">{suggestion.priority}</span>
<span className="message">{suggestion.message}</span>
</div>
))}
</div>
<div className="keywords">
<h4>关键词分析</h4>
<div className="keyword-section">
<h5>已匹配关键词</h5>
<div className="keyword-list matched">
{analysis.matchedKeywords.map((keyword) => (
<span key={keyword} className="keyword">
{keyword}
</span>
))}
</div>
</div>
<div className="keyword-section">
<h5>缺失关键词</h5>
<div className="keyword-list missing">
{analysis.missingKeywords.map((keyword) => (
<span key={keyword} className="keyword">
{keyword}
</span>
))}
</div>
</div>
</div>
</div>
)
}
AI 内容生成示例
function useAIContentGeneration() {
const [loading, setLoading] = useState(false)
const [error, setError] = useState(null)
const generateWorkExperience = async (context, jobDescription) => {
try {
setLoading(true)
setError(null)
const response = await fetch('/api/ai/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
type: 'work_experience',
context,
jobDescription,
tone: 'professional',
language: 'zh-cn'
})
})
const data = await response.json()
if (data.success) {
return data.data
} else {
throw new Error(data.error)
}
} catch (err) {
setError(err.message)
throw err
} finally {
setLoading(false)
}
}
const generatePersonalSummary = async (context, jobDescription) => {
try {
setLoading(true)
const response = await fetch('/api/ai/generate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: JSON.stringify({
type: 'personal_summary',
context,
jobDescription,
tone: 'professional',
language: 'zh-cn'
})
})
const data = await response.json()
if (data.success) {
return data.data
} else {
throw new Error(data.error)
}
} catch (err) {
setError(err.message)
throw err
} finally {
setLoading(false)
}
}
return {
loading,
error,
generateWorkExperience,
generatePersonalSummary
}
}
❌ 错误处理
常见错误码
错误码 | HTTP 状态 | 描述 |
---|---|---|
AI_SERVICE_UNAVAILABLE | 503 | AI 服务暂不可用 |
INVALID_RESUME_DATA | 400 | 简历数据格式错误 |
JOB_DESCRIPTION_TOO_SHORT | 400 | 职位描述过短 |
CONTENT_GENERATION_FAILED | 500 | 内容生成失败 |
ANALYSIS_QUOTA_EXCEEDED | 429 | 分析次数超限 |
UNSUPPORTED_LANGUAGE | 400 | 不支持的语言 |
错误响应示例
{
"error": "AI 服务暂时不可用,请稍后重试",
"code": "AI_SERVICE_UNAVAILABLE",
"details": {
"service": "ats_analyzer",
"retryAfter": 300
}
}
🚦 使用限制
请求频率限制
订阅类型 | ATS 分析 | 内容生成 | 主题推荐 |
---|---|---|---|
FREE | 3次/天 | 5次/天 | 2次/天 |
PREMIUM | 50次/月 | 100次/月 | 20次/月 |
ENTERPRISE | 无限制 | 无限制 | 无限制 |
内容限制
- 简历内容: 最大 50KB
- 职位描述: 最大 10KB
- 生成内容: 最大 5KB
- 分析报告: 最大 1MB
下一步
🔗 Webhooks
了解如何使用 Webhooks 接收实时通知
💡 示例代码
浏览完整的代码示例和最佳实践