API 참조
소개
각 Gaia 노드는 OpenAI 호환 API 서버입니다. Gaia 노드 API를 기반으로 애플리케이션을 빌드할 수 있습니다. 사용자 다른 AI 에이전트 프레임워크에서 OpenAI API 구성을 Gaia 노드 API로 대체할 수도 있습니다.
모든 API 요청을 전송하는 기본 URL은 다음과 같습니다. https://node_id.gaianet.network/v1
.
참고
다음을 교체해야 합니다. YOUR_API_KEY_GOES_HERE
당신의 자체 API 키. 고유한 API 키를 얻으려면 다음을 따르세요. 이 튜토리얼.
엔드포인트
잡담
그리고 채팅/완성
엔드포인트는 시스템 프롬프트와 사용자 쿼리를 기반으로 LLM 응답을 반환합니다.
비스트리밍
기본적으로 API는 HTTP 응답에 전체 응답을 포함하여 응답합니다.
요청
curl -X POST https://node_id.gaianet.network/v1/chat/completions \
-H 'accept:application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY_GOES_HERE' \
-d '{"messages":[{"role":"system", "content": "You are a helpful assistant."}, {"role":"user", "content": "What is the capital of France?"}], "model": "model_name"}'
응답:
{"id":"chatcmpl-bcfeebe0-5372-42c0-ac92-0615213e1c97","object":"chat.completion","created":1716380086,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","choices":[{"index":0,"message":{"role":"assistant","content":"Paris."},"finish_reason":"stop"}],"usage":{"prompt_tokens":61,"completion_tokens":4,"total_tokens":65}}%
스트리밍
추가 "stream":true
를 요청에 추가하여 LLM이 응답을 생성할 때 API가 부분 응답을 다시 보내도록 할 수 있습니다.
요청:
curl -X POST https://node_id.gaianet.network/v1/chat/completions \
-H 'accept:application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY_GOES_HERE' \
-d '{"messages":[{"role":"system", "content": "You are a helpful assistant."}, {"role":"user", "content": "What is the capital of France?"}], "model": "model_name", "stream":true}'
응답:
data: {"id":"chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4","choices":[{"index":0,"delta":{"role":"assistant","content":"I"},"logprobs":null,"finish_reason":null}],"created":1716381054,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","system_fingerprint":"fp_44709d6fcb","object":"chat.completion.chunk"}
data: {"id":"chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4","choices":[{"index":0,"delta":{"role":"assistant","content":" am"},"logprobs":null,"finish_reason":null}],"created":1716381054,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","system_fingerprint":"fp_44709d6fcb","object":"chat.completion.chunk"}
data: {"id":"chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4","choices":[{"index":0,"delta":{"role":"assistant","content":" a"},"logprobs":null,"finish_reason":null}],"created":1716381054,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","system_fingerprint":"fp_44709d6fcb","object":"chat.completion.chunk"}
...
data: {"id":"chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4","choices":[{"index":0,"delta":{"role":"assistant","content":" an"},"logprobs":null,"finish_reason":null}],"created":1716381055,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","system_fingerprint":"fp_44709d6fcb","object":"chat.completion.chunk"}
data: {"id":"chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4","choices":[{"index":0,"delta":{"role":"assistant","content":" AI"},"logprobs":null,"finish_reason":null}],"created":1716381055,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","system_fingerprint":"fp_44709d6fcb","object":"chat.completion.chunk"}
data: {"id":"chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4","choices":[{"index":0,"delta":{"role":"assistant","content":"."},"logprobs":null,"finish_reason":null}],"created":1716381055,"model":"Llama-3-8B-Instruct-262k-Q5_K_M","system_fingerprint":"fp_44709d6fcb","object":"chat.completion.chunk"}
data: [DONE]
요청 본문
필드 | 유형 | 필수 | 설명 | 기본값 | 예 |
---|---|---|---|---|---|
메시지 | 목록 | 필수 | 대화에 대한 메시지 목록입니다. 1 . 시스템 메시지(사용하는 대형 언어 모드에 따라 다름) * 콘텐츠 의 시스템 메시지가 필요합니다. * "역할":"시스템" 필수2. 사용자 메시지(필수) * 콘텐츠 가 필요합니다. * "role":"user" 필수 | N/A | "messages": ["role": "system","content": "You are a helpful assistant."},{"role": "user", "content": "Hello!"}] |
모델 | 문자열 | 필수 | 사용한 채팅 모델 | N/A | Llama-3-8B-262k-Q5_K_M |
top_p | 번호 | 선택 사항 | 온도를 이용한 샘플링의 대안입니다. 0.8과 같이 값이 높을수록 출력은 더 무작위적이고, 0.2와 같이 값이 낮을수록 더 집중적이고 결정론적입니다. | 1 | 0에서 1 사이의 숫자입니다. |
온도 | 번호 | 선택 사항 | 0.8과 같이 값이 높을수록 출력은 더 무작위적이고, 0.2와 같이 값이 낮을수록 더 집중적이고 결정적입니다. | 1 | 0에서 2 사이의 숫자입니다. |
presence_penalty | 번호 | 선택 사항 | 양수 값은 새로운 토큰이 지금까지 텍스트에 등장했는지 여부에 따라 새로운 토큰에 불이익을 주므로 모델이 새로운 주제에 대해 이야기할 가능성이 높아집니다. | 0 | 2.0에서 2.0 사이의 숫자입니다. |
스트림 | 부울 | 선택 사항 | 답안 스트리밍 출력 만들기 | FALSE | "stream":true |
주파수_페널티 | 번호 | 선택 사항 | 양수 값은 지금까지 텍스트에서 기존 빈도에 따라 새 토큰에 불이익을 주어 모델이 같은 줄을 그대로 반복할 가능성을 낮춥니다. | 0 | 2.0에서 2.0 사이의 숫자입니다. |
응답 본문
필드 | 유형 | 스트리밍 또는 비스트리밍 | 설명 | 기본값 | 예 |
---|---|---|---|---|---|
id | 문자열 | 둘 다 | 채팅 완료를 위한 고유 식별자입니다. | 무작위로 생성됨 | chatcmpl-73a1f57d-185e-42c2-b8a6-ba0bae58f3b4 |
객체 | 문자열 | 둘 다 | 개체 유형 | chat.completion.chunk 를 스트리밍 모드로 전환합니다.chat.completion 를 비스트리밍 모드로 설정합니다. | chat.completion.chunk 를 스트리밍 모드로 전환합니다.chat.completion 를 비스트리밍 모드로 설정합니다. |
선택 사항 | 배열 | 둘 다 | 채팅 완료 선택 목록입니다. | "choices":[{"index":0,"message":{"role":"assistant","content":"Paris."},"finish_reason":"stop"}] | |
생성 | 정수 | 둘 다 | 채팅 완료가 생성된 때의 유닉스 타임스탬프(초 단위)입니다. | N/A | 1716380086 |
모델 | 문자열 | 둘 다 | 채팅 완료에 사용되는 모델입니다. | 사용하는 모델에 따라 다릅니다. | Llama-3-8B-Instruct-Q5_K_M |
사용법 | 객체 | 둘 다 | 완료 토큰, 프롬프트 토큰 및 총 토큰을 포함한 완료 요청에 대한 사용 통계입니다. | N/A | "usage":{"prompt_tokens":61,"completion_tokens":4,"total_tokens":65} |
포함
그리고 임베딩
엔드포인트는 사용자 쿼리 또는 파일 청크에 대한 임베딩을 계산합니다.
요청
curl -X POST https://node_id.gaianet.network/v1/embeddings \
-H 'accept:application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY_GOES_HERE' \
-d '{"model": "nomic-embed-text-v1.5.f16", "input":["Paris, city and capital of France, ..., for Paris has retained its importance as a centre for education and intellectual pursuits.", "Paris’s site at a crossroads ..., drawing to itself much of the talent and vitality of the provinces."]}'
응답:
{
"object": "list",
"data": [
{
"index": 0,
"object": "embedding",
"embedding": [
0.1428378969,
-0.0447309874,
0.007660218049,
...
-0.0128974719,
-0.03543198109,
0.03974733502,
0.00946635101,
-0.01531364303
]
},
{
"index": 1,
"object": "embedding",
"embedding": [
0.0697753951,
-0.0001159032545,
0.02073983476,
...
0.03565846011,
-0.04550019652,
0.02691745944,
0.02498772368,
-0.003226313973
]
}
],
"model": "nomic-embed-text-v1.5.f16",
"usage": {
"prompt_tokens": 491,
"completion_tokens": 0,
"total_tokens": 491
}
}
검색
그리고 검색
엔드포인트는 사용자의 쿼리에 따라 노드의 벡터 컬렉션에서 텍스트를 검색할 수 있습니다.
요청:
curl -X POST https://node_id.gaianet.network/v1/retrieve \
-H 'accept:application/json' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_API_KEY_GOES_HERE' \
-d '{"messages":[{"role":"system", "content": "You are a helpful assistant."}, {"role":"user", "content": "What is the location of Paris?"}], "model":"nomic-embed-text-v1.5.f16"}'
응답:
{
"points": [
{
"source": "\"Paris is located in northern central France, in a north-bending arc of the river Seine whose crest includes two islands, the Île Saint-Louis and the larger Île de la Cité, which form the oldest part of the city. The river's mouth on the English Channel is about 233 mi downstream from the city. The city is spread widely on both banks of the river. Overall, the city is relatively flat, and the lowest point is 35 m above sea level. Paris has several prominent hills, the highest of which is Montmartre at 130 m.\\n\"",
"score": 0.74011195
},
{
"source": "\"The Paris region is the most active water transport area in France, with most of the cargo handled by Ports of Paris in facilities located around Paris. The rivers Loire, Rhine, Rhône, Me\\n\"",
"score": 0.63990676
},
{
"source": "\"Paris\\nCountry\\tFrance\\nRegion\\nÎle-de-France\\r\\nDepartment\\nParis\\nIntercommunality\\nMétropole du Grand Paris\\nSubdivisions\\n20 arrondissements\\nGovernment\\n • Mayor (2020–2026)\\tAnne Hidalgo (PS)\\r\\nArea\\n1\\t105.4 km2 (40.7 sq mi)\\n • Urban\\n (2020)\\t2,853.5 km2 (1,101.7 sq mi)\\n • Metro\\n (2020)\\t18,940.7 km2 (7,313.0 sq mi)\\nPopulation\\n (2023)\\n2,102,650\\n • Rank\\t9th in Europe\\n1st in France\\r\\n • Density\\t20,000/km2 (52,000/sq mi)\\n • Urban\\n (2019)\\n10,858,852\\n • Urban density\\t3,800/km2 (9,900/sq mi)\\n • Metro\\n (Jan. 2017)\\n13,024,518\\n • Metro density\\t690/km2 (1,800/sq mi)\\nDemonym(s)\\nParisian(s) (en) Parisien(s) (masc.), Parisienne(s) (fem.) (fr), Parigot(s) (masc.), \\\"Parigote(s)\\\" (fem.) (fr, colloquial)\\nTime zone\\nUTC+01:00 (CET)\\r\\n • Summer (DST)\\nUTC+02:00 (CEST)\\r\\nINSEE/Postal code\\t75056 /75001-75020, 75116\\r\\nElevation\\t28–131 m (92–430 ft)\\n(avg. 78 m or 256 ft)\\nWebsite\\twww.paris.fr\\r\\n1 French Land Register data, which excludes lakes, ponds, glaciers > 1 km2 (0.386 sq mi or 247 acres) and river estuaries.\\n\"",
"score": 0.62259054
},
{
"source": "\" in Paris\\n\"",
"score": 0.6152092
},
{
"source": "\"The Parisii, a sub-tribe of the Celtic Senones, inhabited the Paris area from around the middle of the 3rd century BC. One of the area's major north–south trade routes crossed the Seine on the île de la Cité, which gradually became an important trading centre. The Parisii traded with many river towns (some as far away as the Iberian Peninsula) and minted their own coins.\\n\"",
"score": 0.5720232
}
],
"limit": 5,
"score_threshold": 0.4
}
모델 가져오기
그리고 모델
엔드포인트는 노드에서 사용 가능한 채팅 및 임베딩 모델을 제공합니다.
요청:
curl -X POST https://node_id.gaianet.network/v1/models
응답:
{"object":"list","data":[{"id":"Llama-3-8B-Instruct-262k-Q5_K_M","created":1716383261,"object":"model","owned_by":"Not specified"},{"id":"nomic-embed-text-v1.5.f16","created":1716383261,"object":"model","owned_by":"Not specified"}]}%
노드 정보 가져오기
그리고 정보
엔드포인트는 노드에 대한 자세한 정보를 제공합니다.
요청:
curl -X POST https://node_id.gaianet.network/v1/info
응답:
{
"version": "0.5.0",
"plugin_version": "b2694 (commit 0d56246f)",
"port": "8080",
"models": [
{
"name": "Llama-2-7b-chat-hf-Q5_K_M",
"type": "chat",
"prompt_template": "Llama2Chat",
"n_predict": 1024,
"n_gpu_layers": 100,
"ctx_size": 4096,
"batch_size": 512,
"temperature": 1.0,
"top_p": 1.0,
"repeat_penalty": 1.1,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
},
{
"name": "all-MiniLM-L6-v2-ggml-model-f16",
"type": "embedding",
"prompt_template": "Llama2Chat",
"n_predict": 1024,
"n_gpu_layers": 100,
"ctx_size": 384,
"batch_size": 512,
"temperature": 1.0,
"top_p": 1.0,
"repeat_penalty": 1.1,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
}
],
"qdrant_config": {
"url": "http://localhost:6333",
"collection_name": "default",
"limit": 5,
"score_threshold": 0.4
}
}
상태 코드
HTTP 응답 코드 | 설명 | 이유 | 솔루션 |
---|---|---|---|
404 | 찾을 수 없음 | 엔드포인트 URL이 잘못되었습니다. | 엔드포인트 URL을 확인하세요. |
500 | 내부 서버 오류 | 모델을 찾을 수 없습니다. | 모델명을 확인해 주세요. |
400 | 잘못된 요청 |