Skip to content

Conversation

@donghyeon639
Copy link
Contributor

Purpose

Does this introduce a breaking change?

[ ] Yes
[x] No

Pull Request Type

What kind of change does this Pull Request introduce?

[ ] Bugfix
[x] New feature
[ ] Refactoring (no functional changes, no api changes)
[ ] Documentation content changes
[ ] Other... Please describe:

README updated?

The top-level readme for this repo contains a link to each sample in the repo. If you're adding a new sample did you update the readme?

[ ] Yes
[ ] No
[x] N/A

How to Test

  • Get the code
git clone https://github.com/donghyeon639/open-chat-playground.git
cd open-chat-playground
git checkout  feat/269-connector-implementation-inheritance-ollama
  • Test the code
dotnet test test/OpenChat.PlaygroundApp.Tests/OpenChat.PlaygroundApp.Tests.csproj --filter "FullyQualifiedName~Ollama"

What to Check

Verify that the following are valid

  • Whether you inherited LanguageModelConnector
  • inserted AppSettings and overridden GetChatClient
  • Check if the unit tests in OllamaConnectorTests.cs pass
  • Check if the bicep file ollama template is written correctly

Other Information

@tae0y
Copy link
Member

tae0y commented Sep 18, 2025

#455 (comment)
말씀하신 것처럼 Ollama 컨테이너를 따로 올려서 도커 내부끼리 연결하는 방법이 있습니다.
저희 프로젝트에 어떤 방식으로 적용할지는 bicep, 마크다운 단계에서 같이 고민해보시죠!

@tae0y
Copy link
Member

tae0y commented Sep 18, 2025

개요

replacement of #455
리뷰는 다음과 같이 순서대로 진행하겠습니다

  • 커넥터 코드 로직 / 다른 부분을 확인하고, 전체적으로 다시확인
    • model 태그명 유효성 검사
    • baseurl 경계값 테스트 추가
  • bicep
  • 마크다운 문서
  • 현재 bicep은 외부에서 baseurl을 받는 구조로 되어 있음. 어딘가에 ollama를 로컬에 띄우고 연결하여 통합테스트 가능한 구조. 차후에는 Azure Container Registry, Serverless GPU 등 사용한 구조로 완전히 변경하여야함.

백로그

  • 기본값변경: llama3.2는 3b에서도 한국어에 제대로 답변하지 못해서, 기본모델을 gemma/qwen 정도로 바꾸면 좋겠음. 특히나 8GB RAM 정도의 노트북에서 CPU로 가볍게 돌릴 수 있는 모델로.
    • Q : 하늘은 무슨 색이야?
    • A : 하늘은 하늘색이지만,จร래 나무 아래의 빛과 어두운 shade로 변한다.
  • 기능추가: ollama에 pull되지 않은 model을 선택시 명시적인 예외를 던지기
  • 기능개선:모델명으로 불러온 모델은 태그없이 연결가능. 모델명:태그로 불러온 모델은 태그를 꼭 붙여야함. 태그를 지정하지 않은 경우, 해당 모델이 하나뿐이면 연결해주고 두개 이상이면 ambiguous model name으로 CLI에 안내해주기.
  • EnsureLanguageModelSettingsValid 메서드의 경계값 커버리지
  • Ollama 도커파일 추가, 볼륨 설정

커버해야하는 경계값은?

  • 공백 : 예) "", " "
  • null
  • 값 앞뒤로 trailing 공백
    • settings.BaseUrl!.Trim()) 로직이 있음
  • 유효하지 않은 값, 이하 예시
    • baseurl인데 url포맷이 아닌경우
    • modelname인데 ollama 네이밍 컨벤션을 따르지 않는경우
      • latest 모델의 경우 태그 생략가능, 태그를 꼭 써야하는 경우는 문서에 기재

Copy link
Member

@tae0y tae0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다! 먼저 로컬 머신에서 기동하는 부분을 테스트했습니다.
확인해보니 몇가지 상의할 부분이 있었습니다.

첫째로 Model의 경우 Ollama의 네이밍 컨벤션을 고려해 유효성 검사 로직이 필요할까요?
제 생각에는 차후에 문서에 잘 반영해두면 될 것 같은데 어떠실까요?

둘째로 테스트에서 커버할 경계값을 더 추가하면 좋겠습니다.
현재는 공백, null에 대해서 다루고 있습니다.
Model의 경우에는 위에서 유효성 검사 로직 추가여부에 따라 달라질 것 같고,
Uri를 잘못된 형식으로 전달한 경우도 테스트해도 좋을 것 같습니다.

그외에 테스트 컨벤션을 잘 반영해주셨습니다. 😎😎

@donghyeon639
Copy link
Contributor Author

커버해야하는 경계값은?

  • 공백 : 예) "", " "

  • null

  • 값 앞뒤로 trailing 공백

  • 유효하지 않은 값, 이하 예시

    • baseurl인데 url포맷이 아닌경우
    • modelname인데 ollama 네이밍 컨벤션을 따르지 않는경우

값 앞뒤로 trailing 공백에 대한 부분은 settings.BaseUrl!.Trim()) == true 부분에서 공백이 없어지기에 추가하지 않는다고 판단해서 추가하지 않았습니다 baseurl에 url 포맷이 아닌경우에 대한 경계값은 EnsureLanguageModelSettingsValid 메서드는 단순히string.IsNullOrWhiteSpace만 체크하기에 GetChatClientAsync에서 경우에만 추가하였습니다!

@tae0y
Copy link
Member

tae0y commented Sep 19, 2025

로컬 컨테이너 배포시

  • 호스트 머신의 Ollama를 사용한다면 현재와 같이 http://host.docker.internal:11434 사용
    • 이 경우 호스트 머신 Ollama가 도커쪽 요청을 들을 수 있도록 환경변수 설정 필요
    • 맥/리눅스 export OLLAMA_HOST=0.0.0.0, 윈도우 그.. 고급 시스템설정
  • Ollama 컨테이너는 컨테이너 이름을 사용하여 http://ollama:11434와 같이 사용
    • 이 경우 호스트 머신쪽 설정 불필요
    • Ollama용 도커파일을 추가하고, 두개 컨테이너를 한번에 올릴 수 있도록 문서화 필요
    • Ollama 모델파일을 불필요하게 매번 불러오지 않도록 볼륨 처리 필요하겠음

    Connector 구현 이슈 범위는 아니므로, 별도 이슈를 등록하여 개선건으로 진행

👉 그래서 해야할 일은

  • 호스트 머신 Ollama가 도커쪽 요청을 들을 수 있도록 환경변수 설정 가이드 추가
  • Ollama 도커파일 추가하기

Azure 클라우드 배포시 위 작업 완료후 진행

  • Azure에 Ollama를 어떻게 프로비저닝할지 검토

👉 하지만 일단은

  • Azure 배포 디버깅하기
ERROR: error executing step command 'provision': deployment failed: error deploying infrastructure: deploying to subscription: 

Deployment Error Details:
InvalidTemplateDeployment: The template deployment 'openchatPlaygroundapp' is not valid according to the validation procedure. The tracking id is '8dd4174a-fdda-4e6b-9c8b-005b1b96edb2'. See inner errors for details.
ValidationForResourceFailed: Validation failed for a resource. Check 'Error.Details[0]' for more information.
ContainerAppSecretInvalid: Invalid Request: Container app secret(s) with name(s) 'github-models-token' are invalid: value or keyVaultUrl and identity should be provided.

Copy link
Member

@tae0y tae0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트코드 잘 확인했습니다!
다른 부분을 본 다음 돌아와서 다시 전체적으로 확인해보시죠.

그전에 호스트 머신의 Ollama를 사용하기 위한 설정방법을 문서에 추가하고,
Azure 배포시 발생하는 오류를 해결해야합니다.
저도 방법을 찾아보고 코멘트 등으로 공유드리겠습니다.

@donghyeon639
Copy link
Contributor Author

로컬 컨테이너 배포시

  • 호스트 머신의 Ollama를 사용한다면 현재와 같이 http://host.docker.internal:11434 사용

    • 이 경우 호스트 머신 Ollama가 도커쪽 요청을 들을 수 있도록 환경변수 설정 필요
    • 맥/리눅스 export OLLAMA_HOST=0.0.0.0, 윈도우 그.. 고급 시스템설정
  • Ollama 컨테이너는 컨테이너 이름을 사용하여 http://ollama:11434와 같이 사용

    • 이 경우 호스트 머신쪽 설정 불필요
    • Ollama용 도커파일을 추가하고, 두개 컨테이너를 한번에 올릴 수 있도록 문서화 필요
    • Ollama 모델파일을 불필요하게 매번 불러오지 않도록 볼륨 처리 필요하겠음

    Connector 구현 이슈 범위는 아니므로, 별도 이슈를 등록하여 개선건으로 진행

👉 그래서 해야할 일은

  • 호스트 머신 Ollama가 도커쪽 요청을 들을 수 있도록 환경변수 설정 가이드 추가
  • Ollama 도커파일 추가하기

Azure 클라우드 배포시 위 작업 완료후 진행

  • Azure에 Ollama를 어떻게 프로비저닝할지 검토

👉 하지만 일단은

  • Azure 배포 디버깅하기
ERROR: error executing step command 'provision': deployment failed: error deploying infrastructure: deploying to subscription: 

Deployment Error Details:
InvalidTemplateDeployment: The template deployment 'openchatPlaygroundapp' is not valid according to the validation procedure. The tracking id is '8dd4174a-fdda-4e6b-9c8b-005b1b96edb2'. See inner errors for details.
ValidationForResourceFailed: Validation failed for a resource. Check 'Error.Details[0]' for more information.
ContainerAppSecretInvalid: Invalid Request: Container app secret(s) with name(s) 'github-models-token' are invalid: value or keyVaultUrl and identity should be provided.

말씀하신 내용 확인했습니다! 정리하자면

  1. Ollama를 별도 컨테이너로 배포

필요한 과정:
Ollama용 Dockerfile 추가: Ollama 서비스를 실행할 수 있는 전용 Dockerfile을 프로젝트에 추가.

컨테이너 동시 실행 설정: 애플리케이션 컨테이너와 Ollama 컨테이너를 한 번에 실행하고 관리할 수 있도록 docker-compose.yml 같은 파일을 작성

모델 데이터 유지를 위한 볼륨 설정: Ollama가 모델 파일을 매번 새로 내려받지 않도록, 컨테이너 외부의 특정 경로와 컨테이너 내부의 모델 저장 경로를 볼륨으로 연결

컨테이너 간 통신 설정: 애플리케이션에서는 http://ollama:11434와 같이 컨테이너 이름을 사용해 Ollama 서비스에 접근하도록 설정
결론적으로 이 과정을 말씀하신게 맞을까요?

@tae0y
Copy link
Member

tae0y commented Sep 22, 2025

결론적으로 이 과정을 말씀하신게 맞을까요?

네 맞습니다~
Azure Container Apps로 배포하려고 하다보니 그런건데,
Azure에 어떻게 배포하면 좋을지 검토해서 공유해주실래요?

제 의견은 컨테이너화하고, Container Apps로 배포, 이후 서버리스 GPU를 사용하는 것입니다.
이렇게 하면 Azure Virtual Machine을 사용했을 때보다 비용이 보다 저렴하고,
꼭 Azure가 아니더라도 다른 클라우드 플랫폼, OnPrem 환경에서 사용하기에도 좋을 것 같습니다.

@donghyeon639
Copy link
Contributor Author

제가 알고 있는 토대로 host.docker.internal:11434 방식으로 문서 추가했습니다. ollama 쪽 환경변수로 함은 $env:OLLAMA_HOST = "0.0.0.0:11434" 쪽을 말하시는것 같아서 이 부분 추가했는데 다른 부분일까요?

@tae0y
Copy link
Member

tae0y commented Sep 23, 2025

제가 알고 있는 토대로 host.docker.internal:11434 방식으로 문서 추가했습니다. ollama 쪽 환경변수로 함은 $env:OLLAMA_HOST = "0.0.0.0:11434" 쪽을 말하시는것 같아서 이 부분 추가했는데 다른 부분일까요?

네 이부분 말씀드린게 맞습니다. 현재 단계에서는 Ollama는 Azure 배포를 하지 않는데,
지금 추가하신 Bicep 구문을 원복할지.. placeholder로 남겨놓을지 좀더 고민해보겠습니다.

Copy link
Member

@tae0y tae0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

다음 두가지 반영해주셔요!

1) bicep으로 배포시 오류나는 것 확인하고 수정방법 제안.

우리는 ollama를 사용하는데, 아래 구문에서 github models 관련 값이 null이어서 오류발생함! 값 유무를 보고 분기 처리해야할 것 같음.
https://github.com/aliencube/open-chat-playground/pull/456/files#diff-e800ed75064b740be458a572b91420b94ca6743a609c7318facf638f60c7028bL141

OpenAI쪽 이슈에서는 이렇게 처리했군요!
https://github.com/aliencube/open-chat-playground/pull/429/files#diff-e800ed75064b740be458a572b91420b94ca6743a609c7318facf638f60c7028bR150

2) Ollama baseurl도 처리

나중에 ollama를 Azure에서 구동할 예정이라서, 문서에 https://{{OLLAMA_PLACEHOLDER}}:11434 이런 느낌으로 연결 URL 넘겨주는 방법도 포함하고, bicep에도 해당 변수를 처리할 수 있도록 수정해주셔요.

@tae0y
Copy link
Member

tae0y commented Sep 26, 2025

리뷰 준비되면 댓글로 변경사항 간략히 알려주세요

전체적으로 잘 동작하는지 확인되면,
다시 코드단으로 돌아가 컨벤션을 맞추는 작업을 진행합니다 !

@donghyeon639
Copy link
Contributor Author

리뷰 준비되면 댓글로 변경사항 간략히 알려주세요

전체적으로 잘 동작하는지 확인되면, 다시 코드단으로 돌아가 컨벤션을 맞추는 작업을 진행합니다 !

  1. Ollama 사용 시 GitHub Models 관련 배포 오류 해결하였습니다
    조건부로 githubModelsToken 값이 있을 때만 env에 secretRef가 추가 되게끔하는 방식을 사용했습니다.

  2. URL 넘겨주는 방법도 포함하고, bicep에도 해당 변수를 처리할 수 있도록 수정하였습니다

Copy link
Member

@tae0y tae0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ollama.md 스타일 컨벤션 몇개 놓친게 있어서 반영해주시고,
테스트 쪽은 내일 이어서 확인해볼게요.
먼저 이 PR로 반영된것 참고해주세요.
#494

@donghyeon639
Copy link
Contributor Author

ollama.md 스타일 컨벤션 몇개 놓친게 있어서 반영해주시고, 테스트 쪽은 내일 이어서 확인해볼게요. 먼저 이 PR로 반영된것 참고해주세요. #494
테스트 과정에서 문제가 생겨서 원인 찾고 다시 올리겠습니다.. 뭔가 이것저것 추가하다보니 꼬인 느낌이여서 테스트 코드부터 다시 확인해보겠습니다.. 시험기간이여서 제대로 확인을 못하고 있어서 자주 확인 못한점 죄송합니다..

@tae0y
Copy link
Member

tae0y commented Oct 18, 2025

@donghyeon639 네 우선 리뷰 요청 주실때까지 기다리고 있겠습니다!
아무래도 기한이 있어서 필요하면 저도 개발 진행해서 기여할 수도 있어요.

@donghyeon639
Copy link
Contributor Author

@donghyeon639 네 우선 리뷰 요청 주실때까지 기다리고 있겠습니다! 아무래도 기한이 있어서 필요하면 저도 개발 진행해서 기여할 수도 있어요.
LanguageModelConnector에서 ollama가 지원되지않은 커넥터로 분류 되어있어서 지원되는 커넥터로 추가하여 테스트 오류 해결하였습니다 추가적으로 말씀하신 ollama 문서부분 수정하였는데 curl http://localhost:11434/api/version는 따로 powershell 부분을 명시하였는데 아에 제외하라는 말씀이신가요?
추가적으로 ollama 커넥터에서 모델을 자동으로 끌어오는 로직을 추가하면서 테스트 환경에서도 실제로 올라마 접근을 하여 오류가 발생하는것 같기에 테스트 환경이 아닐때에만 모델을 끌어오게 변경하였습니다

@donghyeon639
Copy link
Contributor Author

donghyeon639 commented Oct 21, 2025

@tae0y CI/CD 파이프라인에서 Ollama 서버가 돌아가여 커넥터 부분 코드, 커넥터 테스트 부분 수정하였습니다!

@tae0y
Copy link
Member

tae0y commented Oct 22, 2025

ollama 커넥터에서 모델을 자동으로 끌어오는 로직을 추가하면서 테스트 환경에서도 실제로 올라마 접근을 하여 오류가 발생하는것 같기에 테스트 환경이 아닐때에만 모델을 끌어오게 변경하였습니다

@donghyeon639 동현님 이 부분이 코드에서 어느 부분일까요?
ollama 문서에서 curl 부분은 제가 착각한 거였습니다 ~

@donghyeon639
Copy link
Contributor Author

ollama 커넥터에서 모델을 자동으로 끌어오는 로직을 추가하면서 테스트 환경에서도 실제로 올라마 접근을 하여 오류가 발생하는것 같기에 테스트 환경이 아닐때에만 모델을 끌어오게 변경하였습니다

@donghyeon639 동현님 이 부분이 코드에서 어느 부분일까요? ollama 문서에서 curl 부분은 제가 착각한 거였습니다 ~

해당사항 CI/CD 파이프라인에서 Ollama 서버가 돌아가면서 제거하였습니다!
private const string BaseUrl = "http://localhost:11434";
private const string Model = "llama3.2"; 그래서 해당부분으로 수정하였습니다!

@tae0y
Copy link
Member

tae0y commented Oct 22, 2025

넵넵 리뷰가 밀리면서 백로그에 있던게 다 머지가 되어있네요.
이제 거의 다 된 것 같은데, 마지막으로 한번 더 확인해볼게요!

@tae0y
Copy link
Member

tae0y commented Oct 23, 2025

테스트

  • LanguageModelConnector.cs case문에서 LLM Provider 지원순서를 지키기
  • Connector
  • 테스트
    • LanguageModelConnector를 상속하는지에 대한 테스트
    • 예외발생 테스트 컨벤션 Tests are NOT testing exceptions #451
    • 하드코딩된 magic string 상수화
    • 경계값 테스트
    • 테스트 시나리오 커버리지
    • Connector 로직 테스트
      • 생성자 : 각 파라미터별 실패, 전체 Valid and 성공
      • EnsureLanguageModelSettingsValid() : 각 파라미터별 실패, 전체 Valid and 성공
      • GetChatClientAsync() : 각 파라미터별 실패, 전체 Valid and 성공
      • LanguageModelConnector.CreateChatClientAsync() : 각 파라미터별 실패, 전체 Valid and 성공
    • 테스트 메서드명 컨벤션

Copy link
Member

@tae0y tae0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 코드는 이렇게 수정해주셔요!

@tae0y
Copy link
Member

tae0y commented Oct 23, 2025

문서는 #515 Draft를 보시고 병합하거나 해서 반영해주세욥.
Huggingface 쪽 참고해서 Serverless GPU 사용하는 부분 추가했고,
기타 내용 배치 순서 등 컨벤션을 맞췄습니다 ~

@justinyoo
Copy link
Contributor

문서는 #515 Draft를 보시고 병합하거나 해서 반영해주세욥. Huggingface 쪽 참고해서 Serverless GPU 사용하는 부분 추가했고, 기타 내용 배치 순서 등 컨벤션을 맞췄습니다 ~

#515 PR을 직접 https://github.com/donghyeon639/open-chat-playground/tree/feat/269-ollama-connector-implementation-clean 브랜치로 날려도 됩니다. 그러면 @donghyeon639 님이 바로 머지할 수 있어요. 굳이 두번 일 하지 않아도 됩니다.

- 기본모델 이외에 추가모델을 3개에서 1개로 변경함
- 레포 루트경로 확인하는 단계 위치를 수정함
- Azure Serverless GPU 사용하는 단계 추가함
@tae0y
Copy link
Member

tae0y commented Oct 24, 2025

#515 PR을 직접 https://github.com/donghyeon639/open-chat-playground/tree/feat/269-ollama-connector-implementation-clean 브랜치로 날려도 됩니다. 그러면 @donghyeon639 님이 바로 머지할 수 있어요. 굳이 두번 일 하지 않아도 됩니다.

넵! 이 브랜치로 바로 push 했습니다.
동현님도 내용 확인해주시고, 다음번 push때 merge conflict 잡아주셔요.

tae0y added 3 commits October 25, 2025 10:54
- 테스트 주입 데이터를 InlineData로 이동
- 테스트명에 테스트하는 메서드명을 기재
- CreateChatClientAsync에서 settings가 null인 경우 테스트 추가
- expected 예외타입 수정
Copy link
Member

@tae0y tae0y left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다! Ollama는 Huggingface, LG의 바탕이 되는 Connector이고,
비용없이 돌려볼 수 있어 사용자들이 가장 처음, 그리고 가장 많이 사용할 Connector라 생각해요.
저희 깃헙 액션에서도 Ollama를 활용해 UI 통합테스트를 진행하고 있습니다.

이 Connector 개발 과정에서 함께 Ollama 사용자 환경 설정 가이드에 대한 고민하고,
Ollama 관련 Docker Container를 어떤 방식으로 지원할지, Azure에 서빙하는 방법도 구상했습니다.
여러 단위/통합테스트 컨벤션과 사용자 입력값의 검증, 경계값 테스트까지 잘 반영했습니다!

긴 시간 고생많으셨어요. 머지합니다! 🥳🔥

@tae0y tae0y merged commit c640deb into aliencube:main Oct 25, 2025
1 check passed
@tae0y
Copy link
Member

tae0y commented Oct 25, 2025

머지후 test-deploy 실패했으나 Ollama 관련은 아님.

image

타임아웃의 원인은 잘 모르겠음. 일단 이력만 남겨놓음.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Connector Implementation & Inheritance: Ollama

4 participants