goldfishh / chatgpt-tool-hub

An open-source chatgpt tool ecosystem where you can combine tools with chatgpt and use natural language to do anything.
MIT License
1.22k stars 165 forks source link

使用维基插件,配置代理无效【或者是有没有人维基插件使用代理成功了?】 #91

Closed Zhaobudaoyuema closed 7 months ago

Zhaobudaoyuema commented 7 months ago

前置确认

1. 网络能够访问openai接口

2. git pull 拉取最新代码

3. 执行pip install -r requirements.txt,检查依赖是否满足

4. 在已有 issue 中未搜索到类似问题

5. 注意,提issue前请确认用本项目test.py(参考README.md 快速开始配置)重试一次你的问题是否能复现

问题描述

问题: 使用维基插件,配置代理无效。 描述: 1. 源码理解:查看插件源代码发现这一段代码。我理解的是 如果配置了代理,那么就把wikipedia的_wiki_request方法重载,之后使用重载之后的方法进行代理请求。 2. debug效果: 但是我配置了之后无效,debug发现不会调用我自己重载的方法,还是依旧调用wikipedia自己的方法。 疑问: 我看了一下wikipedia的search()方法中调用_wiki_request是不带模块名的,搜了一下说,如果不带模块名是不能重载的 搜到的: 引用问题: 确保在 a.py 中调用 _wiki_request 函数时使用了模块名前缀,即使用 a._wiki_request() 而不是直接调用 _wiki_request()。 插件源码:

 @model_validator(mode='before')
    def validate_environment(cls, values: Dict) -> Dict:
        """Validate that the python package exists in environment."""
        proxy = get_from_dict_or_env(values, 'proxy', "PROXY", "")
        proxies = {
            'http': proxy,
            'https': proxy,
        }
        try:
            import wikipedia
            if proxy:
                def _wiki_request(params):
                    '''
                    Make a request to the Wikipedia API using the given search parameters.
                    Returns a parsed dict of the JSON response.
                    '''
                    import requests
                    from datetime import datetime

                    params['format'] = 'json'
                    if not 'action' in params:
                        params['action'] = 'query'

                    headers = {
                        'User-Agent': wikipedia.USER_AGENT
                    }

                    if wikipedia.RATE_LIMIT and wikipedia.RATE_LIMIT_LAST_CALL and \
                        wikipedia.RATE_LIMIT_LAST_CALL + wikipedia.RATE_LIMIT_MIN_WAIT > datetime.now():

                        # it hasn't been long enough since the last API call
                        # so wait until we're in the clear to make the request

                        wait_time = (wikipedia.RATE_LIMIT_LAST_CALL + wikipedia.RATE_LIMIT_MIN_WAIT) - datetime.now()
                        time.sleep(int(wait_time.total_seconds()))

                    r = requests.get(wikipedia.API_URL, params=params, headers=headers, proxies=proxies)

                    if wikipedia.RATE_LIMIT:
                        wikipedia.RATE_LIMIT_LAST_CALL = datetime.now()

                    return r.json()
               # 这里赋值是否不生效
                wikipedia._wiki_request = _wiki_request
            # 本土化
            wikipedia.set_lang("zh")
            values["wiki_client"] = wikipedia

            values["wikipedia_top_k_results"] = get_from_dict_or_env(
                values, 'wikipedia_top_k_results', "WIKIPEDIA_TOP_K_RESULTS", 2
            )
        except ImportError:
            raise ValueError(
                "Could not import wikipedia python package. "
                "Please it install it with `pip install wikipedia`."
            )

        return values

wikipedia源码:

@cache
def search(query, results=10, suggestion=False):
  '''
  Do a Wikipedia search for `query`.

  Keyword arguments:

  * results - the maxmimum number of results returned
  * suggestion - if True, return results and suggestion (if any) in a tuple
  '''

  search_params = {
    'list': 'search',
    'srprop': '',
    'srlimit': results,
    'limit': results,
    'srsearch': query
  }
  if suggestion:
    search_params['srinfo'] = 'suggestion'
# 重载就是想要这个能调用我写的方法
  raw_results = _wiki_request(search_params)