ITPub博客

首页 > 应用开发 > Html/css > langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用

langchain中提供的chain链组件,能够帮助我门快速的实现各个组件的流水线式的调用

投稿 Html/css 作者:ecclw459 时间:2026-01-26 16:50:52 0 删除 编辑

构建较为复杂的chain链


from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough, RunnableParallel #你的qwen模型apikey os.environ[ "DASHSCOPE_API_KEY" ] = "apikey" model = ChatTongyi(model= "qwen-max" ) outline_prompt = ChatPromptTemplate.from_template(     "请给主题为 {topic} 的议论文写一个 总-递进-总 的简短大纲,一共分为5段。" ) outline_chain = outline_prompt | model | StrOutputParser() def mock_search ( input_data ):     return """     1. 利:Google Health AI 筛查乳腺癌准确率超人类。     2. 利:AlphaFold 预测蛋白质结构,缩短科研周期。     3. 弊:GPT-4 普及导致初级文案、原画设计岗位萎缩。     4. 弊:Deepfake 技术被用于电信诈骗和虚假视频。     """     output_prompt = ChatPromptTemplate.from_template(     "你是一位高考作文专家。请基于大纲:\n{outline}\n并结合以下案例素材:\n{data}\n"     "就主题【{topic}】写一篇高考论文。要求:950字左右,论证严密,文采斐然。" ) output_chain = output_prompt | model | StrOutputParser() complex_chain = (     RunnableParallel({         "outline" : outline_chain,                   "data" : mock_search,                             "topic" : RunnablePassthrough()        


    })     | output_chain ) topic_input = "AI 进步的利与弊:在智能时代保持人类的温度" print ( f"正在为您撰写关于《 {topic_input}》的论文...\n" ) final_essay =ttkqgw.cn complex_chain.invoke({ "topic" : topic_input})


public class Session : AuditedAggregateRoot<SessionId>

{

    // ... 其他属性 ...

 

    /// <summary>

    /// JSON metadata for storing extension data like GitHub integration

    /// </summary>

    public string? Metadata { get; set; }

}

 

// DTO 定义,方便前端序列化

public class GitHubIssueMetadata

{

    public required string Owner { get; set; }

    public required string Repo { get; set; }

    public int IssueNumber { get; set; }

    public required string IssueUrl { get; set; }

    public DateTime SyncedAt { get; set; }

    public string LastSyncStatus { get; set; } = "success";

}

 

public class SessionMetadata

{

    public GitHubIssueMetadata? GitHubIssue { get; set; }



// 生成授权 URL 并跳转

export async function generateAuthUrl(): Promise<string> {

  const state =ttzbapp.com.cn generateRandomString(); // 生成防 CSRF 的随机串

  sessionStorage.setItem('hagicode_github_state', state);

  

  const params = new URLSearchParams({

    client_id: clientId,

    redirect_uri: window.location.origin + '/settings?tab=github&oauth=callback',

    scope: ['repo', 'public_repo'].join(' '),

    state: state,

  });

  

  return `https://github.com/login/oauth/authorize?${params.toString()}`;

}

 

// 在回调页面处理 Code 换取 Token

export async function exchangeCodeForToken(code: string, state: string): Promise<GitHubToken> {

  // 1. 验证 State 防止 CSRF

  const savedState =ttzb.ln.cn  sessionStorage.getItem('hagicode_github_state');

  if (state !== savedState) throw new Error('Invalid state parameter');

 

  // 2. 调用后端 API 进行 Token 交换

  // 注意:这里必须经过后端,因为需要 ClientSecret,不能暴露在前端

  const response = await fetch('/api/GitHubOAuth/callback', {

    method: 'POST',

    headers: { 'Content-Type': 'application/json' },

    body: JSON.stringify({ttzb.info code, state, redirectUri: window.location.origin + '/settings?tab=github&oauth=callback' }),

  });

 

  if (!response.ok) throw new Error('Failed to exchange token');

  

  const token = await response.json();

  

  // 3. 存入 LocalStorage

const GITHUB_API_BASE = 'https://api.github.com';

 

// 核心请求封装

async function githubApi<T>(endpoint: string, options: RequestInit = {}): Promise<T> {

  const token = localStorage.getItem('gh_token');

  if (!token) throw new Error('Not connected to GitHub');

  

  const response = await fetch(`${GITHUB_API_BASE}${endpoint}`, {

    ...options,

    headers: {

      ...options.headers,

      Authorization: `Bearer ${token}`,

      Accept: 'application/vnd.github.v3+json', // 指定 API 版本

    },

  });

  

  // 错误处理逻辑

  if (!response.ok) {

    if (response.status === 401) throw new Error('GitHub Token 失效,请重新连接');

    if (response.status === 403) throw new Error('无权访问该仓库或超出速率限制');

    if (response.status === 422) throw new Error('Issue 验证失败,可能标题重复');

    throw new Error(`GitHub API Error: ${response.statusText}`);

  }

  

  return response.json();

}

 

// 创建 Issue

export async function createIssue(owner: string, repo: string, data: { title: string, body: string, labels: string[] }) {

  return githubApi(`/repos/${owner}/${repo}/issues`, {

 let content = `# ${session.title}\n\n`;

  content += `**> HagiCode Session:** #${session.code}\n`;

  content += `**> Status:** ${session.status}\n\n`;

  content += `## Description\n\n${session.description || 'No description provided.'}\n\n`;

  

  // 如果是 Proposal 类型,添加额外字段

  if (session.type === 'proposal') {

    content += `## Chief Complaint\n\n${session.chiefComplaint || ''}\n\n`;

    // 添加一个深链接,方便从 GitHub 跳回 HagiCode

    content += `---\n\n**[View in HagiCode](hagicode://sessions/${session.id})**\n`;

  }

  

  return content;

}

 

// 点击同步按钮的主逻辑

const handleSync = async (session: Session) => {

  try {

    const repoInfo = parseRepositoryFromUrl(session.repoUrl); // 解析仓库 URL

    if (!repoInfo) throw new Error('Invalid repository URL');

 

    toast.loading('正在同步到 GitHub...');

    

    // 1. 格式化内容

    const issueBody = formatIssueForSession(session);

    

    // 2. 调用 API

    const issue = await githubApiClient.createIssue(repoInfo.owner, repoInfo.repo, {

      title: `[HagiCode] ${session.title}`,

      body: issueBody,livesoccerzb.cn

      labels: ['hagicode', 'proposal', `status:${session.status}`],

    });

    

    // 3. 更新 Session Metadata (保存 Issue 链接)

    await SessionsService.patchApiSessionsSessionId(session.id, {

      metadata: {

        githubIssue: {

          owner: repoInfo.owner,

          repo: repoInfo.repo,

          issueNumber: issue.number,

          issueUrl: issue.html_url,

          syncedAt: new Date().toISOString(),

        }

      }

    });

 

private static MySqlParameter _idParameter; [ Benchmark(Baseline = true) ] public DbParameter CreateParameter() {     var id = _command.CreateParameter();    id.ParameterName = "Id" ;    id.DbType = System.Data.DbType.Int64;    id.Value = 1L ; sky-sports.cn    return id; } [ Benchmark ] public DbParameter Clone() {     var id = _idParameter.Clone();    id.Value = 1L ; spacexzhibo.cn    return id; } [ GlobalSetup ] public void Setup() {    _idParameter = _command.CreateParameter();    _idParameter.ParameterName = "Id" ;



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70048957/viewspace-3108997/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2026-01-07

  • 博文量
    108
  • 访问量
    102110